{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WXQt5xXDWmpg"
      },
      "source": [
        "\n",
        "This colab provides a walk-through examples for calculating fractal parameters, as described in the following paper:\n",
        "\n",
        "```\n",
        "Alabdulmohsin, Ibrahim, Vinh Q. Tran, and Mostafa Dehghani.\n",
        "\"Fractal Patterns May Unravel the Intelligence in Next-Token Prediction.\"\n",
        "arXiv preprint arXiv:2402.01825 (2024).\n",
        "```\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "KfmzfvFxPuk7",
        "vscode": {
          "languageId": "python"
        }
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iOVCm4CnP1Do"
      },
      "source": [
        "\u003ca href=\"https://colab.research.google.com/github/google-research/google-research/blob/master/fractals_language/fractal_patterns_in_language.ipynb\" target=\"_parent\"\u003e\u003cimg src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/\u003e\u003c/a\u003e"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JJ9RmYHecmRU"
      },
      "source": [
        "# Setup"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 325,
          "status": "ok",
          "timestamp": 1710848398904,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "dqFlbYE91guQ",
        "outputId": "a4669df5-685b-47bb-9735-3e4e57a44b8d"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "GPU 0: Tesla T4 (UUID: GPU-10bb6167-0f81-0360-ed99-971ea5fe3cdd)\n",
            "               total        used        free      shared  buff/cache   available\n",
            "Mem:              12           0           7           0           4          11\n",
            "Swap:              0           0           0\n"
          ]
        }
      ],
      "source": [
        "!nvidia-smi -L  # code was tested with T4\n",
        "!free -g"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 27153,
          "status": "ok",
          "timestamp": 1710848426056,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "Q6WXZC7N1t1J",
        "outputId": "e3406c42-1567-41b2-f44a-cfd6cf63b238"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m510.5/510.5 kB\u001b[0m \u001b[31m5.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m116.3/116.3 kB\u001b[0m \u001b[31m2.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m194.1/194.1 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h"
          ]
        }
      ],
      "source": [
        "!pip install -q datasets transformers"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JfAvhI241xV9"
      },
      "outputs": [],
      "source": [
        "import datasets\n",
        "import torch\n",
        "import tqdm.notebook\n",
        "import transformers\n",
        "\n",
        "import numpy as np\n",
        "import sklearn.linear_model\n",
        "import jax, jax.numpy as jnp\n",
        "\n",
        "import matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "np.random.seed(2024)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 17,
          "status": "ok",
          "timestamp": 1710848440284,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "DjdtQXkP1zF9",
        "outputId": "d3ae2f3f-c7ed-4d21-d4c4-5b1471d1c493"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            },
            "text/plain": [
              "'cuda:0'"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "device = \"cuda:0\" if torch.cuda.is_available() else \"cpu\"\n",
        "device"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LKWac6t3lK-3"
      },
      "source": [
        "# Utils"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6_y03h7HlMyJ"
      },
      "outputs": [],
      "source": [
        "# These default values are different in the paper. For illustration purposes\n",
        "# here, we use only 100 documents. In the paper, we use 1K documents per domain.\n",
        "# See the docstrings for how to select arguments carefully.\n",
        "\n",
        "DEFAULT_SCALES = [25, 50, 75, 100, 200, 300]\n",
        "DEFAULT_SAMPLES_PER_DOC = 100\n",
        "DEFAULT_EPS = 5e-2\n",
        "\n",
        "\n",
        "latex_context = {\n",
        "    'text.usetex': False,\n",
        "    'mathtext.fontset': 'stix',\n",
        "    'font.family': 'sans-serif',\n",
        "    'font.size': 20.0,\n",
        "    'legend.fontsize': 20.0,\n",
        "    'axes.labelsize': 20.0,\n",
        "    'axes.titlesize': 20.0,\n",
        "    'xtick.labelsize': 20.0,\n",
        "    'ytick.labelsize': 20.0,\n",
        "    'axes.axisbelow': True,\n",
        "}\n",
        "\n",
        "\n",
        "def power_law_fit(x, y):\n",
        "  \"\"\"Fit a power law to the data (x, y).\"\"\"\n",
        "  ones_logx = np.stack([np.ones_like(x), np.log(x)], axis=1)\n",
        "  logy = np.log(y)\n",
        "  clf = sklearn.linear_model.LinearRegression(\n",
        "      fit_intercept=False).fit(ones_logx, logy)\n",
        "  return clf.coef_[0], clf.coef_[1]  # coeff, exponent\n",
        "\n",
        "\n",
        "def plot_power_law(x, y,\n",
        "                   xlabel, ylabel, title='', yscale='',\n",
        "                   ylim=None, xlim=None, xticks=None, yticks=None):\n",
        "  \"\"\"Plot a power law fit to the data (x, y).\"\"\"\n",
        "  if xlim is None:\n",
        "    minx, maxx = min(x), max(x)\n",
        "  else:\n",
        "    minx, maxx = tuple(xlim)\n",
        "\n",
        "  log_beta, c = power_law_fit(x, y)\n",
        "  xp = np.linspace(minx, maxx, 100)\n",
        "  yp = np.exp(log_beta) * np.power(xp, c)\n",
        "\n",
        "  with matplotlib.rc_context({**latex_context}):\n",
        "    fig, axes = plt.subplots(1, 1, figsize=(4, 4), constrained_layout=True)\n",
        "\n",
        "    axes.scatter(x, y, s=200, marker=\"o\")\n",
        "    axes.plot(xp, yp, 'red')\n",
        "    axes.set_xlabel(xlabel)\n",
        "    axes.set_ylabel(ylabel)\n",
        "    axes.set_xscale('log')\n",
        "    axes.grid(axis='y')\n",
        "    axes.set_ylim(ylim)\n",
        "    axes.set_xlim(xlim)\n",
        "    if yscale == 'log': axes.set_yscale('log')\n",
        "    if title: axes.set_title(title)\n",
        "    if xticks: axes.set_xticks(xticks)\n",
        "    if yticks: axes.set_yticks(yticks)\n",
        "  return fig"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "MavUzH6Fcr4K"
      },
      "source": [
        "# Language model\n",
        "We use GPT2 as an example in this colab demo."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "referenced_widgets": [
            "bcad87fd132742aeae65cee5a0f5fecb",
            "da3f1af4724a44c2b7c26c983c41f6f3",
            "ab36b05069c34c7285503dd54abb3755",
            "dfb6a67e6394409eb3ad5cd8764ae0b2",
            "559ec76241844f8dad0e32043fc4737c",
            "c08b23e666014b939a7ce8a497e5dbbb",
            "6c634f0f9b7b4429b2cfc4928b4eb7ff",
            "941af0b5713943d7918862efe7bf2c56",
            "61333afe27274f2188db7c896432ce04",
            "aed77868aa944308aa1ff3085fc067bf",
            "36e85ea8cc4a4c82ad9fc7b8a022f900",
            "77418b5d7c314a0e94c61cb761a881a3",
            "5297dfbb0da84771820b549d9e8efd75",
            "c02d058a9ab74f3ba4cc7f6275793702",
            "9ec71254ff634c188995d112186a3b6f",
            "37d6dbb305de47739ab53f83ecc2eb7f",
            "ce16ed15b9d34d4e8190ee45ba7d1a64",
            "96127a471601411ab346e12caecfe7b7",
            "24ffe7ad35344391a81211273a6d5422",
            "9d8a0c286bec44e78a7d3187c44d2225",
            "9aba268d01eb45aebe6d73b4d26e2b26",
            "59fe7387dc5b44df91b85b002a22d4b1",
            "4957aa10e2ed4672a7f6724bbc5184a3",
            "8e7d6ad18cd848aca88bc4d4f4e7e4ed",
            "aa6f16a964e24294be68023c96677cb4",
            "69d754332c904be9bb7111256e8be535",
            "5fc74fee87d2415092734fa7d64a7b4c",
            "37ec9b266ffc4287aad590add208629a",
            "1a1d2b233c96474791631b064fcb6283",
            "906206bc8e704efab83f4539e173acfb",
            "f1f07fca407948c18a5eb95c737a35e7",
            "a26b029c92a048899880e5c079fc1ace",
            "9381c90eaacb48c19b5d87d7e1275651",
            "f08dd8b5ffeb4dcb8b9f86e4258e467d",
            "1ab45cb867d54d9591142197b2350150",
            "53d32d06a3bd4fa4ad68853e840fbb7a",
            "24397247a9284208b173e7c0856418d4",
            "c36cdb762c99498980be1b43c433c17d",
            "68afd09904c44cd0910ca6f9522675e7",
            "b08cf41c6436416db755af3c2cb5b055",
            "72ff1ccc948a485aa0d0b9f23209fa84",
            "8d2b1259cadb430bb1626df81039ebd8",
            "6d4917d46d15412093795317dce41c37",
            "1f104eed409e4cee93b5096c9922739f",
            "a9cdb49b053a48e3928f1b8b94cc41af",
            "0e42c9e425ee48e6902eb8f73279e2b9",
            "e69c2d9819274f69aa7395ab4f3725a4",
            "2410ebd1af8a4ab0a6c6fd56ac3253a8",
            "ad5fedca9f7046219251a83f91312dc8",
            "d84c3448f2fc44d9a51df070d91f6bc6",
            "272a2de69eed4aa388903f6feb6c90a0",
            "3a2df33a9f144afba3c1b29f9c62b1e5",
            "fb24fb822202458fa7af82a525aec4da",
            "a14916569d4a4f158c01f9202b8a729b",
            "46381c57b145477fb47d5925601f0a13",
            "7058309a86bb49bdb8c25c61141dfb90",
            "079561fa448f4fd7a639b947a9fd8631",
            "dd49c054a21445b8a6b676e0a4353700",
            "3275388c13c54f63b2325cc642fdfdf6",
            "3df0c9dc69d247129787e5d986d46ed5",
            "541a7b2ac9064a808413c6c273ee75ab",
            "0ebae4ad345c417f95e8d4eb32dac9e2",
            "c4797675ea8b4c149c93174cc9fbafcc",
            "0216fdca49714d358f702c45b7437499",
            "84b9c5039ca3412a9147ff32b6d1b533",
            "bcdc6b4fb2184e6f9f4360e9470d9c09",
            "e675754756e8492393e3f87176b9eaef",
            "6bae70c7336848c89171e08db1409330",
            "8bc575734d6a47e493c624f9b7847dfb",
            "5b4a255d02614106afa3f18096f716ce",
            "8e63358922f749bf9fb0723d740a51f2",
            "f780591ff670467a870ec2a0f7e89806",
            "c2e1ab17600e4c88b9ac609cbdecbcfc",
            "3446c1da7152476aac79114975f60c49",
            "fd365efd499445ecb2b21527465e3c17",
            "49dda2b0d1bb48f9a003b29bdbf59135",
            "2570d13ac6ba4dc4a7221818a5ca3fd7"
          ]
        },
        "executionInfo": {
          "elapsed": 11565,
          "status": "ok",
          "timestamp": 1710848452162,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "hAGDwmb-16hN",
        "outputId": "9877f0a8-9459-460e-99b3-b971eba40780"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:88: UserWarning: \n",
            "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
            "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
            "You will be able to reuse this secret in all of your notebooks.\n",
            "Please note that authentication is recommended but still optional to access public models or datasets.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "bcad87fd132742aeae65cee5a0f5fecb",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "config.json:   0%|          | 0.00/665 [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "77418b5d7c314a0e94c61cb761a881a3",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "model.safetensors:   0%|          | 0.00/548M [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "4957aa10e2ed4672a7f6724bbc5184a3",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "generation_config.json:   0%|          | 0.00/124 [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "f08dd8b5ffeb4dcb8b9f86e4258e467d",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "tokenizer_config.json:   0%|          | 0.00/26.0 [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "a9cdb49b053a48e3928f1b8b94cc41af",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "vocab.json:   0%|          | 0.00/1.04M [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "7058309a86bb49bdb8c25c61141dfb90",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "merges.txt:   0%|          | 0.00/456k [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "e675754756e8492393e3f87176b9eaef",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "tokenizer.json:   0%|          | 0.00/1.36M [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "model_name = 'gpt2'\n",
        "model = transformers.GPT2LMHeadModel.from_pretrained(model_name).to(device)\n",
        "tokenizer = transformers.GPT2Tokenizer.from_pretrained(model_name)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iox3WsMhzyEi"
      },
      "outputs": [],
      "source": [
        "MAX_LENGTH = 1024  # gpt2 max supported sequence length"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hn43PXbGc3sB"
      },
      "source": [
        "# Dataset"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "referenced_widgets": [
            "13604cee687f48b695b2acb5060e2c3c",
            "9465bbd4b743490cbc497386cb9ffa3c",
            "dba085b2ef684af692c1d84b86eedcfd",
            "b850baf051954131a1e7cb3f8dfdf725",
            "a0d76d2ef34c46ac8d4080a4c6b95cdf",
            "aaafb4f4bf2246e798f9a4db8de1a480",
            "3cbbda185174414888cbb7fafaeff814",
            "5d264a52136243638f0f2e36f7f21e01",
            "e356c21dae794623bc5ea0a7410ebcc5",
            "0ca2fffda46b494b80839b668d494ca2",
            "95a8ee8cf82a4255981318b5fb2299e2",
            "a30e5d9105a14102867279a5cdfcb660",
            "733397f839de451fa0688307fca7f6cd",
            "70b047658ae04778a9a4811edc222e9e",
            "7c40617a202d4b1bac23cfbe09e71be0",
            "cce29a250082415aa5dd9df6a1cd126a",
            "1435231b4689441181cdb8d45d8c0b04",
            "e9b0b91531214ee6a05075f07777c334",
            "cc007b8ba38c483baafa57440e18a811",
            "5688f4347093485599e8eea5fb8ceaef",
            "5b21855d6abc448db564ac6ac08ff747",
            "3e6d5e24d276459dba46e24c2646ef89",
            "8403e095f7254c61959f717e380c54e9",
            "bd23b628e2af4b42a1f70b4ae328551c",
            "cd35c7520db844259715605820cea612",
            "ece717b7947d4afeb3f8acf53c1856a1",
            "b50d38556151496587505667ef171bc5",
            "6d876e390f094ef59c0644558bd495b5",
            "09c3126bab2a4526bd385f4b9c6c2ada",
            "c4a3dd09886a47879c973665b20c7429",
            "1a49c73a38174c48ab3790eda1720d3a",
            "724f55d420b74ec5bdf0735466375331",
            "40b6c80b52be4e40b320cd1aaba1a6e1",
            "50128ef5fef94569ae586305ec040cc8",
            "e88230072d0d4fc1ae10025656dbd6da",
            "44b77a7ea2d34047bec15ff4ef389181",
            "65ddbb1358384db2a577791b309869f5",
            "ca63864393494300a292b41bdef3f72e",
            "a0a4ce2d18624bcaa6f729ac0025b71c",
            "82da7e87b96d4eaaad901a23bfc61990",
            "913e1beba5af49cb82da189ae1130349",
            "13884aeb46db4bdf8fd3eb9f070b6c55",
            "8389f969ae234fc58e4d2b9208faab00",
            "725289543c204759b82a72056e558828",
            "123d4f3047cf4f868b7693001f59962a",
            "d292d0fcb94246539f46674385393f4a",
            "285ce6d33b41461c8e643a7ab8f946a0",
            "746e771703a74e6680f7f83f2e2ac37f",
            "adfb13b48b1f4a068fb68b43a5fd0277",
            "e7efc15a52104055a0a18a981f7f20c2",
            "b9873005163f45e3a1ac8cd0d950ec05",
            "4a821bd1414c4f51ae9fbfd02a405cb0",
            "7b25f13f1750496fa5f39aa4b3fa8c7c",
            "c41ac5d3f4a04f1cb21e5d1ff41ff3b1",
            "a1b3231458e7411abb1c5c2976af966e",
            "d5cef1d048d04b359bb1ae3fd8a5db1c",
            "48655af6162944a6bae3f18d2f9badff",
            "6e1a7d2bfd5c40ad9ecbe6fe026f7a5c",
            "4415de1932744d51b3e6b6d11db737ed",
            "871ac992bca641ac933d99c3ebbb2c59",
            "c033335cbc8b4f66a6a54fc142399676",
            "d4d982f8f80b4a288d9e0bfdba39b982",
            "8147a4ce6e85478783c2f02f13cf44a6",
            "4538a1f994c84176affd833f5378723b",
            "5647d86944b446b7a24024271aa0aa24",
            "f2a4b1e8a267417d832c89738faf1d24",
            "11e3b1df0b054b518123be88f1bdb827",
            "6384318623a04c13a18761548d7a4103",
            "7f43b8320d9e40d492153a34a1feb76d",
            "f96da2cc02424353a9872b9347359bf9",
            "16122c545a0a417a83142c52b4ca5631",
            "3b1c9a33bb8a4f4a8219ba1ce8b83c28",
            "5aa01444a73048b4b2381906968425c3",
            "6de3031f86d04e049e40c41329d9e7ad",
            "51f8da55952547829bbda7d35984f77d",
            "0ef7374cd0644f138d7a0b09e6838641",
            "0cb769c65aa34a94930fea5e23f24464"
          ]
        },
        "executionInfo": {
          "elapsed": 466419,
          "status": "ok",
          "timestamp": 1710848918579,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "fMkafvTK19a4",
        "outputId": "40ef93ec-fd3b-4557-f4f8-705bea02f710"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/datasets/load.py:1461: FutureWarning: The repository for scientific_papers contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at https://hf.co/datasets/scientific_papers\n",
            "You can avoid this message in future by passing the argument `trust_remote_code=True`.\n",
            "Passing `trust_remote_code=True` will be mandatory to load this dataset from the next major release of `datasets`.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "13604cee687f48b695b2acb5060e2c3c",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Downloading builder script:   0%|          | 0.00/5.35k [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "a30e5d9105a14102867279a5cdfcb660",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Downloading readme:   0%|          | 0.00/8.27k [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "8403e095f7254c61959f717e380c54e9",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Downloading data:   0%|          | 0.00/3.62G [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "50128ef5fef94569ae586305ec040cc8",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Downloading data:   0%|          | 0.00/880M [00:00\u003c?, ?B/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "123d4f3047cf4f868b7693001f59962a",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Generating train split:   0%|          | 0/203037 [00:00\u003c?, ? examples/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "d5cef1d048d04b359bb1ae3fd8a5db1c",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Generating validation split:   0%|          | 0/6436 [00:00\u003c?, ? examples/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "11e3b1df0b054b518123be88f1bdb827",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "Generating test split:   0%|          | 0/6440 [00:00\u003c?, ? examples/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "text/plain": [
              "DatasetInfo(description='\\nScientific papers datasets contains two sets of long and structured documents.\\nThe datasets are obtained from ArXiv and PubMed OpenAccess repositories.\\n\\nBoth \"arxiv\" and \"pubmed\" have two features:\\n  - article: the body of the document, pagragraphs seperated by \"/n\".\\n  - abstract: the abstract of the document, pagragraphs seperated by \"/n\".\\n  - section_names: titles of sections, seperated by \"/n\".\\n\\n', citation='\\n@article{Cohan_2018,\\n   title={A Discourse-Aware Attention Model for Abstractive Summarization of\\n            Long Documents},\\n   url={http://dx.doi.org/10.18653/v1/n18-2097},\\n   DOI={10.18653/v1/n18-2097},\\n   journal={Proceedings of the 2018 Conference of the North American Chapter of\\n          the Association for Computational Linguistics: Human Language\\n          Technologies, Volume 2 (Short Papers)},\\n   publisher={Association for Computational Linguistics},\\n   author={Cohan, Arman and Dernoncourt, Franck and Kim, Doo Soon and Bui, Trung and Kim, Seokhwan and Chang, Walter and Goharian, Nazli},\\n   year={2018}\\n}\\n', homepage='https://github.com/armancohan/long-summarization', license='', features={'article': Value(dtype='string', id=None), 'abstract': Value(dtype='string', id=None), 'section_names': Value(dtype='string', id=None)}, post_processed=None, supervised_keys=None, task_templates=None, builder_name='scientific_papers', dataset_name='scientific_papers', config_name='arxiv', version=1.1.1, splits={'train': SplitInfo(name='train', num_bytes=7148341740, num_examples=203037, shard_lengths=[15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 15000, 8037], dataset_name='scientific_papers'), 'validation': SplitInfo(name='validation', num_bytes=217125512, num_examples=6436, shard_lengths=None, dataset_name='scientific_papers'), 'test': SplitInfo(name='test', num_bytes=217514949, num_examples=6440, shard_lengths=None, dataset_name='scientific_papers')}, download_checksums={'https://s3.amazonaws.com/datasets.huggingface.co/scientific_papers/1.1.1/arxiv-dataset.zip': {'num_bytes': 3624420843, 'checksum': None}, 'https://s3.amazonaws.com/datasets.huggingface.co/scientific_papers/1.1.1/pubmed-dataset.zip': {'num_bytes': 880225504, 'checksum': None}}, download_size=4504646347, post_processing_size=None, dataset_size=7582982201, size_in_bytes=12087628548)"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "ds = datasets.load_dataset('scientific_papers', 'arxiv', split='validation')\n",
        "ds.info"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "az-KEIqYc-un"
      },
      "source": [
        "When calculating fractal parameters, we calculate them over a collection of documents, to ensure we have enough independent samples when estimating, for example, autocorrelations. In the paper, we used 1K documents per domain. For illustration purposes here, we only use 100."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "referenced_widgets": [
            "5f0b2051f5e64ef3911ebec0feb70d1c",
            "0a1f526781f14c3b9964ad9ab43ca726",
            "9cd7b8ef0ff241299baa0db7194a9285",
            "3e989ffa066b495c879b72b2dc46f642",
            "6eda6df9b48e47c3ad523c559cb17980",
            "67bf3eb67e334bfd8b1449879f1e6b79",
            "f877d7fb02f444e886af5560c1b7c732",
            "0bc79506d383473d8d4f2a3afac35ff2",
            "9d519fc43cc14f5c862afc07b4ff7bf2",
            "16e4504328564446b5493b14552ccfec",
            "e1e621c950394ec9b6fad7b01675c249"
          ]
        },
        "executionInfo": {
          "elapsed": 347,
          "status": "ok",
          "timestamp": 1710848918908,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "PmmIbWwO4fEE",
        "outputId": "639ea9a8-b706-40ff-bf25-626cfc2dc421"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "5f0b2051f5e64ef3911ebec0feb70d1c",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/100 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "text/plain": [
              "100"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "num_documents = 100  #@param = 'int'\n",
        "it = iter(ds)\n",
        "\n",
        "texts = []\n",
        "for _ in tqdm.notebook.tqdm(range(num_documents)):\n",
        "  b = next(it)\n",
        "  texts.append(b['article'])  # + '\\n'\n",
        "len(texts)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 10,
          "status": "ok",
          "timestamp": 1710848918909,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "XXQDBV8N9Z4A",
        "outputId": "369efe50-3473-4aee-d12f-d6a0670fbb17"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            },
            "text/plain": [
              "\"the interest in anchoring phenomena and phenomena in confined nematic liquid crystals has largely been driven by their potential use in liquid crystal display devices .\\nthe twisted nematic liquid crystal cell serves as an example .\\nit consists of a nematic liquid crystal confined between two parallel walls , both providing homogeneous planar anchoring but with mutually perpendicular easy directions . in this case\\nthe orientation of the nematic director is tuned by the application of an external electric or magnetic field .\\na precise control of the surface alignment extending over large areas is decisive for the functioning of such devices .\\nmost studies have focused on nematic liquid crystals in contact with laterally uniform substrates . on the other hand substrate inhomogeneities\\narise rather naturally as a result of surface treatments such as rubbing .\\nthus the nematic texture near the surface is in fact non - uniform .\\nthis non - uniformity , however , is smeared out beyond a decay length proportional to the periodicity of the surface pattern .\\nvery often the thickness of the non - uniform surface layer is considerably smaller than both the wavelength of visible light and the thickness of the nematic cell , i.e. , the distance between the two confining parallel walls\\n. hence optical properties of the nematic liquid crystal confined between such substrates correspond to those resulting from effective , uniform substrates .\\nmore recent developments have demonstrated that surfaces patterned with a large periodicity of some micrometers are of considerable interest from a technological point of view ( see , e.g. , ref .\\n@xcite and references therein ) .\\na new generation of electro - optical devices relies on nematic liquid crystals with patterned orientation of the nematic director over small areas which can be achieved by chemically patterning the confining surfaces .\\nfor example , to produce flat - panel displays with wide viewing angles one can use pixels that are divided into sub - pixels , where each sub - pixel is defined by a different orientation of the nematic director , which is induced by the surface structure and subsequently tuned by the electric field .\\nin addition to the technological relevance , nematic liquid crystals in contact with non - uniform substrates provide the opportunity to study basic phenomena such as effective elastic forces between the substrates and phase transitions between various competing nematic textures ( see , e.g. , ref .\\n@xcite and references therein ) .    whereas the influence of homogeneous confining substrates on nematic liquid crystals is now well understood ,\\nthe phase behavior of nematic liquid crystals in contact with chemically or geometrically patterned substrates is still debated .\\none might suppose that theoretical calculations based on continuum theories should resolve the properties of nematic liquid crystals in contact with patterned substrates @xcite .\\nhowever , such calculations are numerically demanding because two- or three - dimensional grids have to be used because of the broken symmetry due to the surface pattern .\\nmoreover , it is very challenging to determine metastable states and energy barriers between them which are important for the understanding of bistable nematic devices @xcite . in the present paper\\nwe adopt a different strategy which takes the advantage of the finite decay length characterizing the influence of the surface pattern on the nematic liquid crystal in the direction perpendicular to the substrate .\\nwe determine first an anchoring energy function and an average surface director orientation of the patterned substrate and obtain an effective free energy for the nematic liquid crystal cell under consideration .\\nwe find remarkably good agreement between the phase diagrams of various systems calculated using this effective free energy function on the one hand and the original free energy functional on the other hand .\\nthe continuum theory for liquid crystals has its origin dating back to at least the work of oseen @xcite and zocher @xcite .\\nthis early version of the continuum theory for nematic liquid crystals played an important role for the further development of the static theory and its more direct formulation by frank @xcite .\\nthe frank theory is formulated in terms of the so - called nematic director @xmath0 , @xmath1 , and its possible spatial distortions .\\nthe nematic director describes the direction of the locally averaged molecular alignment in liquid crystals . in a nematic liquid crystal\\nthe centers of mass of the liquid crystal molecules do not exhibit long - ranged order .\\nthe molecules can translate freely while being aligned , on average , parallel to one another and to the nematic director .\\nit is known that if an initially uniform nematic liquid crystal is distorted by external forces , it relaxes back to the uniform state after the disturbing influence is switched off , signaling that the uniform configuration represents a thermodynamically stable state .\\ntherefore it is assumed that there is a cost in free energy associated with elastic distortions of the nematic director of the form @xmath2\u0026=\u0026\\\\frac{1}{2}\\\\int_v\\nd^3 r\\\\,\\\\left[k_{11}\\\\left(\\\\nabla\\\\cdot\\\\hat{{\\\\bf n}}\\\\right)^2\\\\right.\\\\nonumber \\\\\\\\\u0026+\u0026\\\\!\\\\!\\\\!\\\\left.k_{22}(\\\\hat{{\\\\bf n}}\\\\cdot(\\\\nabla \\\\times\\\\hat{{\\\\bf n}}))^2 + k_{33}(\\\\hat{{\\\\bf n}}\\\\times(\\\\nabla \\\\times \\\\hat{{\\\\bf n}}))^2\\\\right],\\\\nonumber \\\\\\\\ \u0026 \u0026 \\\\label{eq1}\\\\end{aligned}\\\\ ] ] where @xmath3 is the volume accessible to the nematic liquid crystal and @xmath4 , @xmath5 , and @xmath6 are elastic constants associated with splay , twist , and bend distortions , respectively .\\nthe elastic constants depend on temperature and are commonly of the order @xmath7 to . sometimes , for example , when the relative values of the elastic constants are unknown or when the resulting euler - lagrange equations are complicated , the one - constant approximation @xmath8 is made . in this case\\nthe elastic free energy functional reduces to @xmath9\u0026=\u0026\\\\frac{k}{2}\\\\int_v d^3 r\\\\,\\\\left(\\\\nabla\\\\hat{{\\\\bf n}}\\\\right)^2\\\\,.\\\\end{aligned}\\\\ ] ] in the presence of surfaces the bulk free energy @xmath10 must be supplemented by the surface free energy @xmath11 such that the total free energy is given by @xmath12 . in the corresponding equilibrium euler - lagrange equations @xmath13 , @xmath11 leads to appropriate boundary conditions .\\nthe description of the nematic director alignment at the surfaces forming the boundaries is called anchoring .\\nin addition to the so - called free boundary condition where there is no anchoring , one considers weak and strong anchoring . if there are no anchoring conditions imposed on @xmath14 at the boundary , the bulk free energy @xmath15 is minimized using standard techniques of the calculus of variations . in the case of strong anchoring it\\nis also sufficient to minimize the bulk free energy but subject to @xmath14 taking prescribed fixed values at the boundary . in the case of weak\\nanchoring the total free energy @xmath16 , which includes the surface free energy @xmath11 , has to be minimized .\\nthe most commonly used expression for the surface free energy is of the form proposed by rapini and papoular by @xcite : @xmath17=\\\\frac{1}{2}\\\\int_{s } d^2 r\\\\,w({\\\\bf r } ) ( \\\\hat{{\\\\bf n}}\\\\cdot{\\\\nu})^2.\\\\ ] ] the integral runs over the boundary and @xmath18 is the corresponding anchoring strength that characterizes the surface .\\nthe local unit vector perpendicular to the surface is denoted as @xmath14 . for negative @xmath19\\n, this contribution favors an orientation of the molecules perpendicular to the surface , while positive @xmath19 favor degenerate planar orientations at the surface .\\nthe absolute value of the anchoring strength is commonly of the order @xmath20 to .\\nhere we consider a nematic liquid crystal confined between a patterned substrate at @xmath21 and a flat substrate at @xmath22 where the @xmath23 axis is normal to the flat substrate . as figs .\\n[ fig1 ] ( a ) , ( c ) , and ( d ) illustrate , the lower substrate is characterized by geometrical and/or chemical patterns of periodicity @xmath24 along the @xmath25 axis . moreover , the system is translationally invariant in the @xmath26 direction . within the one - constant approximation [ eq .  ( [ eq2 ] ) ] the total free energy functional is given by @xmath27=}\\\\nonumber \\\\\\\\\u0026\u0026\\\\frac{kl}{2}\\\\int\\\\limits_0^p dx\\\\ , \\\\int\\\\limits_{z_0(x)}^d dz\\\\ , [ \\\\nabla\\\\theta(x , z)]^2+f_s[\\\\theta(x , z_0(x))]\\\\ , , \\\\label{eq4}\\\\end{aligned}\\\\ ] ] where @xmath28 is the extension of the system in @xmath26 direction , @xmath29 is the surface profile of the patterned substrate , and @xmath30 . at the upper surface\\nstrong anchoring @xmath31 is imposed .\\ntwist is not considered , i.e. , @xmath32 .\\nof course , the analysis can be straightforwardly extended to the case of different splay and bend constants @xmath4 and @xmath6 , respectively , but this aspect of the problem is important only if the analysis is supposed to yield quantitative results for a specific nematic liquid crystal .\\nthe surface contribution @xmath33 $ ] includes the anchoring energy for which the rapini - papoular form [ eq .  ( [ eq3 ] ) ] is adopted :    .\\nthe upper flat substrate induces strong anchoring , i.e. , @xmath31 , while the lower substrate is characterized by a surface pattern of period @xmath24 in @xmath25 direction .\\nthe system is translational invariant in @xmath26 direction perpendicular to the plane of the figure . in ( a ) the lower sinusoidally grating surface ( groove depth @xmath34 )\\nis endowed with an alternating stripe pattern of locally homeotropic anchoring ( white bars ) and homogeneous planar anchoring ( black bars ) .\\nthe period of the chemical pattern is half the period of the surface grating @xmath24 . in ( c ) and\\n( d ) a pure geometrically structured lower substrate and pure chemically patterned lower substrate , respectively , are shown .\\nthe anchoring direction at the substrates is schematically represented by black rods .\\nquantitatively reliable predictions of the phase behavior of a nematic liquid crystal confined between two substrates at an _ arbitrary _ mean distance @xmath35 in ( a ) can be achieved if the effective free energy function [ eqs .\\n( [ eq6 ] ) - ( [ eq8 ] ) ] is analyzed . to this end\\nthe free energy functional of the nematic liquid crystal confined between two substrates at a _ single _ and rather small mean distance @xmath36 in ( b ) has to be minimized as is discussed in the main text.,width=302 ]    @xmath37=}\\\\nonumber \\\\\\\\\u0026\u0026\\\\!\\\\!\\\\!\\\\!\\\\!\\\\frac{l}{2}\\\\int^p_0 dx\\\\ , w(x)\\\\frac{\\\\left(-\\\\sin(\\\\theta_0(x))z'_0(x)+\\\\cos(\\\\theta_0(x))\\\\right)^2 } { \\\\sqrt{1+(z'_0(x))^2}},\\\\end{aligned}\\\\ ] ]    where @xmath38 .\\nequations ( [ eq4 ] ) and ( [ eq5 ] ) together with the boundary condition for the nematic director at the upper surface completely specify the free energy functional for the system under consideration .\\nthe euler - langrange equations resulting from the stationary conditions of the total free energy with respect to the nematic director field can be solved numerically on a sufficiently fine two - dimensional grid using an iterative method . in order to obtain both stable and metastable configurations , different types of initial configurations\\nhowever , due to the pattern of the lower surface the determination of the director field and the phase diagram turns out to be a challenging numerical problem in particular in the case of large cell widths @xmath35 .\\nmoreover , the energy barrier between two metastable states can not be determined this way .      here\\nwe map the free energy functional @xmath39 $ ] [ eq .\\n( [ eq4 ] ) ] of a nematic liquid crystal cell with _ arbitrary _\\nwidth @xmath35 and arbitrary anchoring angle @xmath40 at the upper surface ( see fig .\\n[ fig1 ]  ( a ) ) onto the effective free energy function @xmath41 where the average surface director orientation @xmath42 @xcite at the lower patterned surface is given by @xmath43 the effective surface free energy function @xmath44 characterizing the anchoring energy at the patterned surface can be written as @xmath45 in order to calculate @xmath42 and @xmath44 explicitly , we first determine numerically the minimum of the free energy @xmath46 of the nematic liquid crystal cell for a _ single _ and rather small value @xmath47 and arbitrary anchoring angle @xmath48 at the upper surface ( see fig .\\n[ fig1 ]  ( b ) ) .\\nthereafter the phase behavior , energy barriers between metastable states , and effective anchoring angles for the system of interest ( fig .\\n[ fig1 ]  ( a ) ) can be obtained for _ arbitrary _ values of @xmath35 and @xmath40 from @xmath49 as a function of the single variable @xmath42 .\\nsuch a calculation is considerably less challenging than minimizing the original free energy functional @xmath39 $ ] with respect to @xmath50 on a two - dimensional @xmath51 grid .\\nhowever , the effective free energy method is applicable only if eq .\\n( [ eq7 ] ) can be inverted in order to obtain @xmath52 which is needed as input into eq .\\n( [ eq8 ] ) .\\nthe condition for this inversion follows from eq .\\n( [ eq7 ] ) : @xmath53 moreover , @xmath54 is practically independent of the cell width @xmath36 provided @xmath55 implying that the interfacial region above the lower substrate does not extend to the upper substrate .    before studying the nematic liquid crystal in contact with the patterned substrates shown in fig .  [ fig1 ]\\nit is instructive to analyze first the nematic liquid crystal confined between two homogeneous flat substrates at a distance @xmath35 .\\nthe upper surface induces strong anchoring , i.e. , .\\nthe free energy functional defined in eq .\\n( [ eq4 ] ) follows as @xmath56\u0026\\\\!\\\\!=\\\\!\\\\!\u0026\\\\frac{klp}{2}\\\\int\\\\limits_0^d dz\\\\ , \\\\left(\\\\frac{d \\\\theta(z)}{d z}\\\\right)^2+f_s(\\\\theta_0).\\\\end{aligned}\\\\ ] ] the solution of the euler - langrange equation @xmath57 subject to the boundary condition at the upper surface @xmath58 interpolates linearly between the top and bottom surfaces :    @xmath59    where @xmath60 follows from the boundary condition at the lower surface . with this solution of the euler - lagrange equation\\nthe minimized free energy function reads @xmath61 it follows directly from eqs .\\n( [ eq6 ] ) - ( [ eq8 ] ) that @xmath62 , @xmath63 , and @xmath64 hence in the case of homogeneous confining substrates the effective free energy function [ eq .\\n( [ eq13 ] ) ] agrees exactly with the minimized free energy function of the original system [ eq .\\n( [ eq12 ] ) ] .\\nin the previous section we have shown that we can describe a nematic liquid crystal confined between two homogeneous substrates by the effective free energy function [ eq .  ( [ eq6 ] ) ] . in this subsection\\nwe apply this approach to the particular case of a nematic liquid crystal confined between a chemically patterned sinusoidal surface and a flat substrate with strong homeotropic anchoring ( see fig .\\n[ fig1 ]  ( a ) ) . the surface profile of the grating surface\\nis given by @xmath65 , where @xmath34 is the groove depth and @xmath66 is the period .\\nas figure [ fig1 ] ( a ) illustrates , the surface exhibits a pattern consisting of alternating stripes with locally homeotropic and homogeneous planar anchoring .\\nthe projection of the widths of the stripes onto the @xmath25 axis is @xmath67 and the anchoring strength is specified by a periodic step function : @xmath68 and @xmath69 for values of @xmath25 on the homeotropic and planar stripes , respectively .\\nfigure [ fig2 ] ( a ) displays @xmath70 ( dashed line ) and @xmath71 ( solid line ) for @xmath72 , @xmath73 , and @xmath74 . the shapes of @xmath70 as a function of @xmath48 and @xmath71 as a function of @xmath42 are rather similar because @xmath75 ( see eq .\\n( [ eq8 ] ) ) for this set of model parameters .\\nfigure [ fig2 ] ( b ) displays the phase diagram plotted as a function of the anchoring angle @xmath40 at the upper substrate and the mean separation of the substrates @xmath35 .\\nthe calculations demonstrate the existence of two ( stable or metastable ) nematic director configurations : the homeotropic ( h ) phase , in which the director field is almost uniform and parallel to the anchoring direction imposed at the upper surface , i.e. , @xmath76 , and the hybrid aligned nematic ( han ) phase , in which the director field varies from @xmath77 at the upper surface to nearly planar orientation through the cell .\\nnote that there are two han textures : han@xmath78 and han@xmath79 corresponding to positive and negative average surface angles at the lower surface ( see also fig .  [\\nfig : diagram ] below ) . for small anchoring angles @xmath40 the han phases\\nare stable provided the cell width is larger than @xmath80 ( more precisely , the han@xmath78 texture is stable for @xmath81 while the han@xmath79 texture is stable for @xmath82 and they coexist at @xmath83 ) . for smaller distances between the substrates\\n@xmath84 the han phases are no longer stable because distortions of the director field are too costly in the presence of the dominating strong anchoring at the upper surface . the comparison of the phase boundary of thermal equilibrium as obtained from the effective free energy method [ eqs .\\n( [ eq6 ] ) - ( [ eq8 ] ) , and solid line in fig .  [ fig2 ]  ( b ) ] and the direct minimization of the underlying free energy functional [ eqs .\\n( [ eq4 ] ) and ( [ eq5 ] ) , and diamonds in fig .  [ fig2 ]  ( b ) ] demonstrate the reliability of the effective free energy method .\\n( see fig .\\n[ fig1 ]  ( b ) ) .\\n@xmath28 is the extension of the cell in the invariant @xmath26 direction , @xmath85 is the isotropic elastic constant , and the anchoring strength on the homeotropic stripes ( white bars in fig .\\n[ fig1 ]  ( b ) ) and planar anchoring stripes ( black bars in fig .\\n[ fig1 ]  ( b ) ) are @xmath72 and @xmath73 , respectively .\\n( b ) phase diagram of the same system as a function of the anchoring angle at the upper flat substrate @xmath40 and the cell width @xmath35 ( see fig .  [ fig1 ]  ( a ) ) .\\nthe solid line denotes first order phase transitions between a homeotropic ( h ) and hybrid aligned nematic ( han@xmath78 and han@xmath79 ) phases . at @xmath86 and @xmath87 there is a triple point where the han@xmath78 , han@xmath79 , and h states coexist .\\nthe solid circle marks the critical point at @xmath88 and @xmath89 .\\nthe limits of metastability of the han@xmath78 ( 1 ) and the h ( 2 ) state are denoted by the dot - dashed lines .\\nthe limit of metastability of the h state for @xmath82 and the han@xmath79 state are not shown for clearness .\\nthe lines and the solid circle follow from analyzing the effective free energy function [ eqs .\\n( [ eq6 ] ) - ( [ eq8 ] ) ] while the diamonds represent the phase boundary of thermal equilibrium as obtained from a direct minimization of the underlying free energy functional [ eqs .\\n( [ eq4 ] ) and ( [ eq5])].,width=302 ]     ( see fig .  [ fig1 ]  ( b ) ) . the anchoring strength on the homeotropic stripes and planar anchoring stripes are @xmath90 and @xmath91 , respectively .\\n( b ) phase diagram of the same system as a function of the anchoring angle at the upper flat substrate @xmath40 and the cell width @xmath35 ( see fig .\\n[ fig1 ]  ( a ) ) .\\nthe solid line denotes the first order phase transition between a homogeneous ( h ) and hybrid aligned nematic ( han@xmath78 ) phase .\\nthe solid circle marks the critical point at @xmath92 and @xmath93 .\\nthe limits of metastability of the han@xmath78 ( 1 ) and the h ( 2 ) state are denoted by the dot - dashed lines .\\nthe lines follow from analyzing the effective free energy function [ eqs .\\n( [ eq6 ] ) - ( [ eq8 ] ) ] while the diamonds and the solid circle represent the phase boundary and a critical point as obtained from a direct minimization of the underlying free energy functional [ eqs .\\n( [ eq4 ] ) and ( [ eq5 ] ) ] . for @xmath94\\nthe phase transition as well as the limits of metastability can not be determined using the effective free energy function because @xmath95 is not known in the region close to its maximum . for clearness ,\\nonly the phase diagram for positive @xmath40 is shown ( c.f .\\n[ fig2]).,width=302 ]    we note that the phase transition between the h and han textures is first order despite the fact that the effective surface free energy favors monostable planar anchoring , i.e. , @xmath44 exhibits only a minimum at @xmath96 in the interval @xmath97 $ ] .\\na first order phase transition in a nematic liquid crystal device with a monostable anchoring condition on a homogeneous lower substrate has been predicted for the special case @xmath98 in refs .\\n@xcite using the empirical expression @xmath99 as input into eq .\\n( [ eq13 ] ) . for @xmath100\\nthis surface free energy has two minima at @xmath101 and @xmath102 in the interval @xmath103 $ ] , and as such is bistable , while for @xmath104 , only the minimum @xmath101 exists , i.e. , the surface is monostable . to study the stability limit of the h phase\\nwe expand @xmath105 in eq .\\n( [ eq13 ] ) around @xmath101 up to sixth order : @xmath106 the h phase corresponds to a local minimum of @xmath105 in eq .\\n( [ eq13 ] ) if @xmath107 , where @xmath108 a standard bifurcation analysis reveals that the transition from the h phase to the han phase can be either first order or continuous .\\nthe transition is continuous if @xmath109 , first order if @xmath110 , and @xmath111 corresponds to a tricritical point . in the case of a first order phase transition\\nthe phase boundary of thermal equilibrium is given by @xmath112 we emphasize that the order of the phase transition depends only on the surface free energy @xmath113 close to @xmath101 for @xmath98 .\\ntherefore it is possible to have a first order phase transition even with a monostable surface characterized by a monotonic surface free energy such as the one shown in fig .\\n[ fig2 ]  ( a ) for @xmath114 $ ] or the empirical equation ( [ eq14 ] ) with @xmath104 as well the more general expression @xcite @xmath115\\\\end{aligned}\\\\ ] ] with appropriate parameters @xmath116 and @xmath117 .\\nfirst order phase transitions between the h and han texture are of particular interest for bistable liquid crystal displays . in a bistable liquid crystal display\\nthe two molecular configurations corresponding to light and dark states are locally stable in the thermodynamic space when the applied voltage is removed @xcite . therefore , power is needed only to switch from one stable state to another , in contrast to monostable liquid crystal displays which require power to switch and to maintain the light and the dark states .\\nwe now turn our attention to the case that it is not possible to evaluate @xmath118 from @xmath119 [ eq .  ( [ eq7 ] ) ] because the condition for this inversion is not satisfied [ eq .  ( [ eq9 ] ) ] . to this end\\nwe have chosen the parameters @xmath90 , @xmath91 , and @xmath74 for the system shown in fig .\\n[ fig1 ]  ( a ) .\\nfigure [ fig3 ] ( a ) display ( dashed line ) and ( solid line ) while the corresponding phase diagram is shown in fig .\\n[ fig3 ]  ( b ) . as is apparent from the solid line in fig .\\n[ fig3 ]  ( a ) it is not possible to determine the effective surface free energy function for the all values of @xmath42 because the upper flat substrate at @xmath36 is too far away from the lower patterned substrate in order to induce all possible average anchoring orientations @xmath42 . in other words , the anchoring energy at the patterned substrate is too large to be balanced by the elastic energy for the chosen mean distance @xmath36 between the substrates ( see fig .\\n[ fig1 ]  ( b ) ) . nevertheless fig .\\n[ fig3 ]  ( b ) demonstrates that even this partial information about the effective surface free energy function can be used to calculate the phase diagram for cell widths sufficiently larger than the width at the critical point @xmath120 .      in the last subsection we have shown that with a suitable chemical and geometrical surface morphology on one of the interior surfaces of a liquid crystal cell\\n, two stable nematic director configurations can be supported .\\nthe zenithally bistable nematic devices that have been studied recently @xcite consist of a nematic liquid crystal confined between a chemically homogeneous grating surface ( see fig .\\n[ fig1 ]  ( c ) ) and a flat substrate with strong homeotropic anchoring .\\nthe profile of the asymmetric surface grating is given by @xmath121 where @xmath34 is the groove depth , @xmath66 the period , and @xmath122 is the `` blazing '' parameter describing the asymmetry of the surface profile\\n. such a grating surface has been studied by brown _\\n@xcite who found a first order transition between the han state , characterized by a low pretilt angle ( @xmath123 ) , and the h state , characterized by a high pretilt angle ( @xmath124 ) . strictly speaking\\n, the h state does not correspond to the homeotropic texture ( see fig .\\n[ fig5 ]  ( b ) below ) , but we keep the same notation as in the previous section for consistency . here\\nwe study phase transitions of a nematic liquid crystal in contact with the blazed surface in a more detail using the effective free energy method discussed in sec .\\nii  c.    in fig .\\n[ fig : blazed ]  ( a ) the minimized free energy @xmath70 ( dashed line ) and the calculated effective surface free energy @xmath71 ( solid line ) are shown for the anchoring strength @xmath125 on the grating surface , the groove depth @xmath126 , and the blazing parameter @xmath127 .\\nthe effective surface free energy is asymmetric with respect to @xmath128 because of the asymmetry of the grating surface . as a consequence\\nalso the phase diagram , plotted as a function of the anchoring angle on the upper surface @xmath40 and the distance @xmath129 is asymmetric ( fig .  [\\nfig : blazed ]  ( b ) ) .\\nhowever , the topology of the phase diagram is the same as in the case of a symmetric substrate ( see figs .\\n[ fig2 ] ( b ) , [ fig3 ] ( b ) , and for a more general discussion sec .\\niii  c below ) .\\n( c ) and eq .\\n( [ eq : blazed ] ) ) .\\nthe locally homeotropic anchoring strength on the blazed surface is @xmath130 , the groove depth is @xmath131 and the blazing parameter is @xmath127 .\\n@xmath28 is the extension of the cell in the invariant @xmath26 direction and @xmath85 is the isotropic elastic constant .\\nthe effective surface free energy ( as well as ) is periodic with the period @xmath132 but it is asymmetric with respect to @xmath133 .\\n( b ) phase diagram of the same system as a function of the anchoring angle at the upper flat substrate @xmath40 and the cell width @xmath35 with the same line code as in figs .\\n[ fig2 ] and [ fig3 ] .\\nthe triple point ( where the han@xmath78 , han@xmath79 and h phases coexist ) is at @xmath134 and @xmath135 , and the critical points ( solid circle ) are at @xmath136 , @xmath137 and @xmath138 , @xmath139\\n. for clearness , only the limits of metastability of the han@xmath79 ( 1 ) phase and the h ( 2 ) phase ( for negative @xmath40 ) are shown.,width=302 ]    ( c ) and eq .\\n( [ eq : blazed ] ) ) with local homeotropic anchoring and a flat surface with strong homeotropic anchoring ( @xmath98 ) as a function of the groove depth @xmath140 and the cell width @xmath129 .\\nthe anchoring strength on the blazed surface is @xmath130 .\\nthe lines correspond to different values of @xmath122 and denote first order transitions between homeotropic ( h ) and hybrid aligned ( han@xmath79 ) phases . for small @xmath140 , the lines extend to @xmath141 corresponding to a first order _ anchoring _ transition between planar and homeotropic phases . upon increasing\\n@xmath140 the first order transition lines end at critical points which are not shown in the figure .\\n( b ) the energy barrier at the first order transitions with the same line code as in ( a ) .\\nthe lines have been obtained from the total effective free energy ( see eq .\\n( [ eq6 ] ) ) , while the diamonds correspond to the energy barriers between the planar and homeotropic effective anchoring which follow from considering only the surface contribution @xmath44.,width=302 ]    ) ) for the hybrid aligned ( han@xmath79 ) phase in ( a ) and the homeotropic ( h ) phase in ( b ) on the lines of the first order transitions ( see fig .  [ fig4 ] ) for a nematic liquid crystal confined between the blazed surface ( see fig .  [ fig1 ]  ( c ) and eq .\\n( [ eq : blazed ] ) ) with local homeotropic anchoring and a flat surface with strong homeotropic anchoring ( @xmath98 ) .\\nthe diamonds in ( a ) and ( b ) correspond to the two minima of the effective surface energy function @xmath142 .\\nthe model parameters and the line code are the same as in fig .\\n, width=302 ]    we now concentrate on the most interesting ( from a practical point of view ) case of strong homeotropic anchoring ( @xmath86 ) at the upper homogeneous surface .\\nfigure [ fig4 ] ( a ) displays the phase diagram for a few values of the blazing parameter @xmath122 and a fixed value of the local homeotropic anchoring strength on the grating surface @xmath130 . for a fixed cell width @xmath129 , asymmetry ( @xmath143 ) leads to a decrease of the groove depth @xmath140 at which there is a first order transition between the han and the h phases , as compared to the nematic liquid crystal cell with the symmetric surface grating ( @xmath144 ) . upon increasing the groove depth\\n@xmath140 the transition line ends at a critical point ( not shown in the figure ) , while it diverges as @xmath145 .\\nthe groove depth @xmath146 corresponds to an _ anchoring _ ( or surface ) transition between low tilt and high tilt _ surface _\\nstates which are the homeotropic and planar effective anchoring states , respectively , in the case @xmath144 .\\nthe effective free energy method allows one to calculate an energy barrier @xmath147 between the two bistable states , which is _ not _\\nfeasible by the direct numerical minimization of the free energy functional .\\nthe results of our calculations are shown in fig .\\n[ fig4 ]  ( b ) .\\nthe asymmetry of the surface grating leads to a decrease of the energy barrier . with increasing groove depth @xmath140 the energy barrier decreases and eventually vanishes upon approaching the critical point .\\nthe diamonds in fig .\\n[ fig4 ]  ( b ) denote the energy barriers for the abovementioned anchoring transitions of a nematic liquid crystal in contact with a single grating surface .\\nthe energy barrier between two bistable states is an important quantity for the design of a zenithally bistable nematic device .\\ntoo small energy barrier , as compared to @xmath148 , would cause spontaneous switching between the two states because of thermal fluctuations , while enlarging the energy barrier leads to an increase of the power consumption . using the calculated values of @xmath147 ( see fig .\\n[ fig4 ]  ( b ) ) one can estimate the energy barrier in a real nematic liquid crystal cell .\\nfor instance , for a cell of area @xmath149 and of width @xmath150 , and taking the typical values @xmath151 and @xmath152 , one obtains @xmath153 for @xmath154 and @xmath155 , which seems to be an acceptable value .\\nanother important quantity in zenithally bistable nematic devices is the average director orientation at the grating surface in the two degenerate states .\\nthe average surface director in the han ( @xmath156 ) and h ( @xmath157 ) states is shown in fig .\\n[ fig5 ] for the same model parameters as in fig .\\n[ fig4 ] and for the values of @xmath140 and @xmath129 corresponding to the coexistence line .\\nthe asymmetry of the surface grating leads to a decrease of @xmath156 and an increase of @xmath158 . for a fixed value of @xmath122\\n, the difference between the two angles decreases with increasing the groove depth @xmath140 and finally vanishes upon approaching the critical point ( not shown in the figure ) .\\nhence the asymmetry of the surface grating leads to a decrease of the groove depth at which the bistability is observed , which improves optical properties @xcite , and to a decrease of the energy barrier , which lowers the power consumption of a zenithally bistable nematic device . on the other hand ,\\nalso the difference between the two bistable states decreases which impairs optical properties of such a device .\\nin section [ iiia ] we have discussed phase diagrams in the @xmath159 plane which can be described in terms of the surface free energy given by eq .  .\\nhowever , it is instructive to consider a more general situation that the surface free energy follows from a truncation of the fourier expansion given in eq .  .\\nto be able to study both symmetric and asymmetric surfaces we assume a natural generalization of eq .\\n, namely @xmath160\\\\,,\\\\end{aligned}\\\\ ] ] which reduces to eq .   in the case of a symmetric surface characterized by @xmath161 .\\nthe angle @xmath162 that minimizes @xmath163 ( see eq .  ) is a function of @xmath40 and @xmath35 .\\nthe derivative @xmath164 is the susceptibility of the system that diverges at the critical thickness @xmath165 and remains finite and positive for @xmath107 . from eq .   the conditions for the critical angle @xmath166 follow as @xmath167 implying that @xmath120 and @xmath166 depend only on the form of @xmath113 .\\nplane for the surface free energy given by eq . .\\n@xmath168 and @xmath169 denote different ( usually non - uniform ) textures , the thick lines correspond to first order transitions , and black circles mark critical points .\\nwhen @xmath11 ( defined on the unit circle @xmath170 ) has one minimum and one maximum the phase diagram can be either of type ( a ) or ( b ) .\\nwhen @xmath11 has two minima and two maxima the phase diagram is of type ( b ) unless the minima are of equal depth , in which case it is of type ( c ) .\\nnote that the lines @xmath171 are identified with each other and the phase diagram can be considered as being on a cylindrical surface.,scaledwidth=49.0% ]    the extremes of @xmath11 given by eq .\\ncan be found easily only in the case of symmetric or antisymmetric ( @xmath172 ) surface and the same concerns the position of critical point . in this work , however , we are interested rather in possible topologies of the phase diagram in the @xmath159 plane , which result from eqs . and , and not in the exact location of critical points or transition lines . to draw schematic phase diagrams we consider @xmath11 as a function defined on the unit circle @xmath170\\ndepending on the parameters @xmath116 and @xmath117 , @xmath113 has either one minimum and one maximum or two minima and two maxima .\\nthis conclusion applies also to the function @xmath173 , thus , there can be either one or two critical points in the phase diagram ( see eqs . and ) . in the limit of large @xmath35\\n, there is always a first order phase transition between two non - uniform textures corresponding to the opposite orientations of the director at @xmath21 .\\nthis is because @xmath174 is not a periodic function of @xmath175 at fixed @xmath40 . to find @xmath40 at the transition we expand @xmath11 around its deepest minimum ( denoted @xmath176 ) , which leads to the approximate free energy : @xmath177 where @xmath178 is the extrapolation length .\\nsince @xmath176 and @xmath179 are equivalent minima of @xmath11 , and both @xmath176 and @xmath40 are allowed to vary in the interval @xmath180 $ ] , the transition occurs at @xmath181 if @xmath182 or at @xmath183 if @xmath184 . with the above information we can now draw schematically the phase diagram ( see fig .  [ fig : diagram ] ) .\\nsince the vertical lines at @xmath171 are to be identified with each other the phase diagram can be considered on a cylindrical surface .\\naway from the transition lines there is a smooth evolution from one texture to another .\\nthis means that at fixed @xmath35 it is possible to transform smoothly the @xmath185 texture into the @xmath186 texture , i.e. , without crossing the transition line , even for @xmath187 .\\nwe note that in some range of parameters , the phase diagram for @xmath11 with one minimum is topologically indistinguishable from that for @xmath11 with two minima ( fig .\\n[ fig : diagram ]  ( b ) ) ; in both cases there are two critical points and a triple point .\\nif @xmath11 has two equal minima ( e.g. , at @xmath101 and @xmath188 in the case of symmetric surface ) the triple point disappears and the first order transition lines extend to @xmath189 , as shown in fig .\\n[ fig : diagram ]  ( c ) .\\nwe have studied the phase behavior of a nematic liquid crystal confined between a flat and a patterned substrate ( fig .\\n[ fig1 ] ) using the frank - oseen model [ eq .\\n( [ eq4 ] ) ] and the rapini - papoular surface free energy [ eq .\\n( [ eq5 ] ) ] . an expression for the effective free energy function of the system [ eq .\\n( [ eq6 ] ) ] was derived by determining an effective surface free energy characterizing the anchoring energy at the patterned surface [ eq .  ( [ eq8 ] ) ] . using the effective free energy function ,\\nwe have determined the phase behavior of the nematic liquid crystal confined between a flat surface with strong anchoring and a chemically patterned sinusoidal surface ( fig .\\n[ fig1 ] ( a ) ) , finding first order transitions between a homeotropic texture ( h ) and hybrid aligned nematic ( han ) textures ( figs .\\n[ fig2 ] ( b ) and [ fig3 ] ( b ) ) .\\nit is possible to have a first order phase transition even with a monostable surface characterized by a monotonic surface free energy function ( fig .\\n[ fig2 ]  ( a ) , @xmath114 $ ] ) .\\nin addition we have performed direct minimizations of the original free energy functional [ eqs .\\n( [ eq4 ] ) and ( [ eq5 ] ) ] on a two - dimensional grid and found remarkably good agreement with the phase boundaries resulting from the effective energy function analysis ( figs\\n.  [ fig2 ] ( b ) and [ fig3 ] ( b ) ) .\\nhence quantitatively reliable predictions of the phase behavior can be achieved using the effective free energy method .    using this method ,\\nwe have also studied the phase behavior ( fig .\\n[ fig : blazed ] ( b ) ) of a nematic liquid crystal confined between a chemically uniform , asymmetrically grooved substrate ( fig .\\n[ fig1 ]  ( c ) and eq .\\n( [ eq : blazed ] ) ) with locally homeotropic anchoring and a flat substrate with strong homeotropic anchoring , which is a typical setup for a zenithally bistable nematic device @xcite .\\nthe asymmetry of the grating substrate leads to a decrease of the groove depth at which a first order transition between the h and han phases occurs ( fig .\\n[ fig4 ]  ( a ) ) .\\nmoreover , we have determined the energy barrier between the two coexisting states ( fig .\\n[ fig4 ]  ( b ) ) .\\nour calculations show that the energy barrier decreases with increasing the asymmetry of the grating surface but it is well above @xmath190 for a typical nematic liquid crystal cell .\\nin addition , the average director orientation at the grating surface in two bistable states has been calculated ( fig .\\n[ fig5 ] ) .\\nthe difference between the two bistable states vanishes with increasing substrate asymmetry , which has a negative effect on the optical properties of a zenithally bistable nematic device .\\nwe have also generalized the model of the effective surface free energy considered by parry - jones _\\n@xcite to the case of asymmetric structured substrates and obtained three possible types of the phase diagram in the plane spanned by the orientation of the director at the homogeneous surface and the thickness of the nematic cell .\\nthe asymmetry of the substrate causes only a shift of transition lines and critical points , compared to the symmetric case , but does not change the topology of the phase diagram .\\nfinally , we have verified that this model allows one to reproduce qualitatively the phase diagram of a nematic liquid crystal confined between a homogeneous planar substrate and an asymmetrically grooved surface ( fig .\\n[ fig : blazed ]  ( b ) and fig .\\n[ fig : diagram ]  ( b ) ) .\""
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "texts[0]  # example"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 8,
          "status": "ok",
          "timestamp": 1710848918909,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "0g3moPA1ymUh",
        "outputId": "8b348255-bbe5-4567-a696-8b03968e8082"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "Token indices sequence length is longer than the specified maximum sequence length for this model (9758 \u003e 1024). Running this sequence through the model will result in indexing errors\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "tensor([[1169, 1393,  287,  ..., 1267, 1267,  764]])"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "text = texts[0]\n",
        "tokens = tokenizer.encode(text, return_tensors='pt')\n",
        "\n",
        "tokens"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qVFQ3vjghS9b"
      },
      "source": [
        "# Tokenize"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "referenced_widgets": [
            "1af782e55c8847b1a89880be8a2ea2ae",
            "c3f60cfdd1684c3b95a895713b7e5fb2",
            "7c4a3a0362ab49e295aaf91dae8d7fe1",
            "a99e198dace74a3ba4fd1d0289479dea",
            "51a4b80c6c3b47578ee4602180c625f5",
            "c5cc4e8393d7483fad6f6da69d912814",
            "9722de1d5c734f6e9959099bd4fa18d8",
            "d36ff3326fb844f0b596c6cc30307836",
            "cd68ab0a94784c018b8b17e07aae8266",
            "531d18dbaf9a454699786856b2e840b6",
            "2894388db9074cb8a649110d4328f90d"
          ]
        },
        "executionInfo": {
          "elapsed": 5146,
          "status": "ok",
          "timestamp": 1710848924049,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "ymqeU3WF4jZ6",
        "outputId": "1119cae1-e81c-4cfe-9979-bcb5eb96a8e5"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "1af782e55c8847b1a89880be8a2ea2ae",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/100 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "tokens = [tokenizer.encode(texts[i], return_tensors='pt') for i in tqdm.notebook.tqdm(range(len(texts)))]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 3,
          "status": "ok",
          "timestamp": 1710848924049,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "CWfElUtwsx_z",
        "outputId": "912e379e-46c6-4735-89a6-bb9d9cc6c1ee"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "tensor([[1169, 1393,  287,  ..., 1267, 1267,  764]])"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "tokens[0]"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 350,
          "status": "ok",
          "timestamp": 1710848924397,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "qkmA4xsujdlh",
        "outputId": "33f842be-5525-4b29-ba2f-a6c0731d6bbf"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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HnzwwZg7d27ccsst8elPfzq+973vxYgRI+L73/9+X9wcADAADOntA77zzjuxefPmWLBgQWHboEGDoqmpKdavX3/U+K6urujq6ipc7+joiIiIzs7O3p5aRER0dx3sk+MCQC764jn28DFTSr1+7MN6PVp+/etfx3vvvRc1NTVF22tqauKXv/zlUeNbWlpi0aJFR21vaGjo7akBABFR8VDfHXvfvn1RUVHRJ8fu9WjpqQULFsT8+fML17u7u+PNN9+Ms846K0pKSj7WMTo7O6OhoSFeffXVKC8v76upcgzWvn9Z//5j7fuPte8/H7b2KaXYt29f1NfX99nt93q0VFdXx+DBg2PPnj1F2/fs2RO1tbVHjS8rK4uysrKibZWVlSd02+Xl5X6A+4m171/Wv/9Y+/5j7fvP8da+r15hOazX34hbWloal1xySaxataqwrbu7O1atWhVTpkzp7ZsDAAaIPvn10Pz582POnDnxuc99Li677LJ46KGH4sCBA3HLLbf0xc0BAANAn0TL9ddfH7/61a/ivvvui7a2tvjMZz4TK1euPOrNub2lrKwsFi5ceNSvmeh71r5/Wf/+Y+37j7XvP/299iWpLz+bBADQS5x7CADIgmgBALIgWgCALIgWACALp0W0LF68OM4999wYNmxYNDY2xk9/+tP+nlJWvv3tb0dJSUnRZcKECYX9b7/9djQ3N8dZZ50VZ5xxRsyePfuoPx64a9euuPrqq2PEiBExatSouOuuu+Ldd98tGrNmzZr47Gc/G2VlZXH++efHsmXLTsbdO6WsW7currnmmqivr4+SkpJYsWJF0f6UUtx3331RV1cXw4cPj6ampnj55ZeLxrz55ptx0003RXl5eVRWVsatt94a+/fvLxqzdevWuPLKK2PYsGHR0NAQDzzwwFFzefTRR2PChAkxbNiwmDRpUjz99NO9fn9PJR+19jfffPNR/w9mzpxZNMban5iWlpa49NJLY+TIkTFq1Ki47rrrorW1tWjMyXycGUjPGR9n7a+66qqjfvZvv/32ojGnzNqnzC1fvjyVlpam73//++kXv/hFmjt3bqqsrEx79uzp76llY+HChemiiy5Ku3fvLlx+9atfFfbffvvtqaGhIa1atSpt2rQpff7zn0+///u/X9j/7rvvpokTJ6ampqb0wgsvpKeffjpVV1enBQsWFMb8z//8TxoxYkSaP39+evHFF9N3vvOdNHjw4LRy5cqTel/729NPP53+8i//Mj322GMpItLjjz9etP/+++9PFRUVacWKFelnP/tZ+qM/+qM0duzY9NZbbxXGzJw5M02ePDlt2LAh/cd//Ec6//zz04033ljY39HRkWpqatJNN92Utm3blh555JE0fPjw9E//9E+FMT/5yU/S4MGD0wMPPJBefPHFdO+996ahQ4emn//8532+Bv3lo9Z+zpw5aebMmUX/D958882iMdb+xMyYMSMtXbo0bdu2LW3ZsiV98YtfTKNHj0779+8vjDlZjzMD7Tnj46z9H/zBH6S5c+cW/ex3dHQU9p9Ka599tFx22WWpubm5cP29995L9fX1qaWlpR9nlZeFCxemyZMnH3Nfe3t7Gjp0aHr00UcL21566aUUEWn9+vUppfefDAYNGpTa2toKY5YsWZLKy8tTV1dXSimlu+++O1100UVFx77++uvTjBkzevne5OPIJ87u7u5UW1ub/u7v/q6wrb29PZWVlaVHHnkkpZTSiy++mCIi/dd//VdhzI9//ONUUlKS/u///i+llNJ3v/vddOaZZxbWPqWU7rnnnjR+/PjC9T/+4z9OV199ddF8Ghsb05/+6Z/26n08VR0vWq699trjfo217z1vvPFGioi0du3alNLJfZwZ6M8ZR659Su9Hy5//+Z8f92tOpbXP+tdD77zzTmzevDmampoK2wYNGhRNTU2xfv36fpxZfl5++eWor6+PcePGxU033RS7du2KiIjNmzfHoUOHitZ4woQJMXr06MIar1+/PiZNmlT0xwNnzJgRnZ2d8Ytf/KIw5oPHODzG9+m3du7cGW1tbUXrVFFREY2NjUVrXVlZGZ/73OcKY5qammLQoEGxcePGwpipU6dGaWlpYcyMGTOitbU1fvOb3xTG+H4cbc2aNTFq1KgYP3583HHHHbF3797CPmvfezo6OiIioqqqKiJO3uOM54yj1/6wH/7wh1FdXR0TJ06MBQsWxMGDBwv7TqW17/ezPH8Sv/71r+O999476i/t1tTUxC9/+ct+mlV+GhsbY9myZTF+/PjYvXt3LFq0KK688srYtm1btLW1RWlp6VEnsaypqYm2traIiGhrazvm9+Dwvg8b09nZGW+99VYMHz68j+5dPg6v1bHW6YPrOGrUqKL9Q4YMiaqqqqIxY8eOPeoYh/edeeaZx/1+HD7GQDRz5sz48pe/HGPHjo0dO3bEX/zFX8SsWbNi/fr1MXjwYGvfS7q7u+POO++Myy+/PCZOnBgRcdIeZ37zm98M6OeMY619RMRXvvKVGDNmTNTX18fWrVvjnnvuidbW1njsscci4tRa+6yjhd4xa9aswr8vvvjiaGxsjDFjxsSPfvQjMcGAccMNNxT+PWnSpLj44ovjvPPOizVr1sS0adP6cWanl+bm5ti2bVs8//zz/T2VAed4a3/bbbcV/j1p0qSoq6uLadOmxY4dO+K888472dP8UFn/eqi6ujoGDx581DvM9+zZE7W1tf00q/xVVlbGhRdeGNu3b4/a2tp45513or29vWjMB9e4trb2mN+Dw/s+bEx5ebkw+v8Or9WH/TzX1tbGG2+8UbT/3XffjTfffLNXvh/+3/zWuHHjorq6OrZv3x4R1r43zJs3L5588sl47rnn4pxzzilsP1mPMwP5OeN4a38sjY2NERFFP/unytpnHS2lpaVxySWXxKpVqwrburu7Y9WqVTFlypR+nFne9u/fHzt27Ii6urq45JJLYujQoUVr3NraGrt27Sqs8ZQpU+LnP/950QP6M888E+Xl5fHpT3+6MOaDxzg8xvfpt8aOHRu1tbVF69TZ2RkbN24sWuv29vbYvHlzYczq1auju7u78EAzZcqUWLduXRw6dKgw5plnnonx48fHmWeeWRjj+/HhXnvttdi7d2/U1dVFhLX/JFJKMW/evHj88cdj9erVR/0K7WQ9zgzE54yPWvtj2bJlS0RE0c/+KbP2H/stu6eo5cuXp7KysrRs2bL04osvpttuuy1VVlYWvcuZD/f1r389rVmzJu3cuTP95Cc/SU1NTam6ujq98cYbKaX3P4o4evTotHr16rRp06Y0ZcqUNGXKlMLXH/443PTp09OWLVvSypUr09lnn33Mj8Pddddd6aWXXkqLFy8ekB953rdvX3rhhRfSCy+8kCIiPfjgg+mFF15I//u//5tSev8jz5WVlemJJ55IW7duTddee+0xP/L8e7/3e2njxo3p+eefTxdccEHRx27b29tTTU1N+pM/+ZO0bdu2tHz58jRixIijPnY7ZMiQ9Pd///fppZdeSgsXLjztP3b7YWu/b9++9I1vfCOtX78+7dy5Mz377LPps5/9bLrgggvS22+/XTiGtT8xd9xxR6qoqEhr1qwp+ljtwYMHC2NO1uPMQHvO+Ki13759e/qrv/qrtGnTprRz5870xBNPpHHjxqWpU6cWjnEqrX320ZJSSt/5znfS6NGjU2lpabrsssvShg0b+ntKWbn++utTXV1dKi0tTZ/61KfS9ddfn7Zv317Y/9Zbb6U/+7M/S2eeeWYaMWJE+tKXvpR2795ddIxXXnklzZo1Kw0fPjxVV1enr3/96+nQoUNFY5577rn0mc98JpWWlqZx48alpUuXnoy7d0p57rnnUkQcdZkzZ05K6f2PPX/rW99KNTU1qaysLE2bNi21trYWHWPv3r3pxhtvTGeccUYqLy9Pt9xyS9q3b1/RmJ/97GfpiiuuSGVlZelTn/pUuv/++4+ay49+9KN04YUXptLS0nTRRRelp556qs/u96ngw9b+4MGDafr06enss89OQ4cOTWPGjElz58496sHU2p+YY617RBQ9BpzMx5mB9JzxUWu/a9euNHXq1FRVVZXKysrS+eefn+66666iv9OS0qmz9iX//04BAJzSsn5PCwAwcIgWACALogUAyIJoAQCyIFoAgCyIFgAgC6IFAMiCaAEAsiBaAIAsiBYAIAuiBQDIgmgBALLw/wCfwyW3pYJQQQAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 640x480 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# distribution of document lengths\n",
        "_ = plt.hist([tokens[i].shape[1] for i in range(len(tokens))], 10)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5elV_SyNkGxI"
      },
      "source": [
        "We only use sufficiently long documents (e.g. \u003e 2K tokens). Later, we drop the leading 128 tokens (warmup) and use only the first 1K tokens (because the second half can contain links, references, etc, not related to the article itself)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 6,
          "status": "ok",
          "timestamp": 1710848924397,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "yTHjO7IRkXzF",
        "outputId": "7f4f01fb-87a3-45bb-eb02-1f237303f3c1"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "torch.Size([1024])\n"
          ]
        }
      ],
      "source": [
        "filtered_tokens = [tokens[i][0, 0: MAX_LENGTH] \\\n",
        "                   for i in range(len(tokens)) \\\n",
        "                   if tokens[i].shape[1] \u003e 2048]\n",
        "\n",
        "print(len(filtered_tokens), filtered_tokens[0].shape)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 5,
          "status": "ok",
          "timestamp": 1710848924397,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "Kp0WQGfX91mD",
        "outputId": "1e9b30c7-b5b0-47ad-8787-3fa1829c0732"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            },
            "text/plain": [
              "'the interest in anchoring phenomena and phenomena in confined nematic liquid crystals has largely been driven by their potential use in liquid crystal display devices.\\nthe twisted nematic liquid crystal cell serves as an example.\\nit consists of a nematic liquid crystal confined between two parallel walls, both providing homogeneous planar anchoring but with mutually perpendicular easy directions. in this case\\nthe orientation of the nematic director is tuned by the application of an external electric or magnetic field.\\na precise control of the surface alignment extending over large areas is decisive for the functioning of such devices.\\nmost studies have focused on nematic liquid crystals in contact with laterally uniform substrates. on the other hand substrate inhomogeneities\\narise rather naturally as a result of surface treatments such as rubbing.\\nthus the nematic texture near the surface is in fact non - uniform.\\nthis non - uniformity, however, is smeared out beyond a decay length proportional to the periodicity of the surface pattern.\\nvery often the thickness of the non - uniform surface layer is considerably smaller than both the wavelength of visible light and the thickness of the nematic cell, i.e., the distance between the two confining parallel walls\\n. hence optical properties of the nematic liquid crystal confined between such substrates correspond to those resulting from effective, uniform substrates.\\nmore recent developments have demonstrated that surfaces patterned with a large periodicity of some micrometers are of considerable interest from a technological point of view ( see, e.g., ref.\\n@xcite and references therein ).\\na new generation of electro - optical devices relies on nematic liquid crystals with patterned orientation of the nematic director over small areas which can be achieved by chemically patterning the confining surfaces.\\nfor example, to produce flat - panel displays with wide viewing angles one can use pixels that are divided into sub - pixels, where each sub - pixel is defined by a different orientation of the nematic director, which is induced by the surface structure and subsequently tuned by the electric field.\\nin addition to the technological relevance, nematic liquid crystals in contact with non - uniform substrates provide the opportunity to study basic phenomena such as effective elastic forces between the substrates and phase transitions between various competing nematic textures ( see, e.g., ref.\\n@xcite and references therein ).    whereas the influence of homogeneous confining substrates on nematic liquid crystals is now well understood,\\nthe phase behavior of nematic liquid crystals in contact with chemically or geometrically patterned substrates is still debated.\\none might suppose that theoretical calculations based on continuum theories should resolve the properties of nematic liquid crystals in contact with patterned substrates @xcite.\\nhowever, such calculations are numerically demanding because two- or three - dimensional grids have to be used because of the broken symmetry due to the surface pattern.\\nmoreover, it is very challenging to determine metastable states and energy barriers between them which are important for the understanding of bistable nematic devices @xcite. in the present paper\\nwe adopt a different strategy which takes the advantage of the finite decay length characterizing the influence of the surface pattern on the nematic liquid crystal in the direction perpendicular to the substrate.\\nwe determine first an anchoring energy function and an average surface director orientation of the patterned substrate and obtain an effective free energy for the nematic liquid crystal cell under consideration.\\nwe find remarkably good agreement between the phase diagrams of various systems calculated using this effective free energy function on the one hand and the original free energy functional on the other hand.\\nthe continuum theory for liquid crystals has its origin dating back to at least the work of oseen @xcite and zocher @xcite.\\nthis early version of the continuum theory for nematic liquid crystals played an important role for the further development of the static theory and its more direct formulation by frank @xcite.\\nthe frank theory is formulated in terms of the so - called nematic director @xmath0, @xmath1, and its possible spatial distortions.\\nthe nematic director describes the direction of the locally averaged molecular alignment in liquid crystals. in a nematic liquid crystal\\nthe centers of mass of the liquid crystal molecules do not exhibit long - ranged order.\\nthe molecules can translate freely while being aligned, on average, parallel to one another and to the nematic director.\\nit is known that if an initially uniform nematic liquid crystal is distorted by external forces, it relaxes back to the uniform state after the disturbing influence is switched off, signaling that the uniform configuration represents a thermodynamically stable state.\\ntherefore it is assumed that there is a cost in free energy associated with elastic distortions of the nematic director of the form @xmath2\u0026=\u0026\\\\frac{1}{2}\\\\int_v\\nd^3 r\\\\,\\\\left[k_{11}\\\\left(\\\\nabla\\\\cdot\\\\'"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "tokenizer.decode(filtered_tokens[0])  # to recover the original text"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R9EgfH1dlkF6"
      },
      "source": [
        "# Score\n",
        "Next, we score all the tokens and convert scores to bits, i.e. we calculate: $-\\log p(tokens[i]\\;|\\; tokens[0:i])$."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 49,
          "referenced_widgets": [
            "9df39a1127104a0ab54979e1b22ba574",
            "44bd1b7a6d1442db8ac3d82e735e156e",
            "43f18d4329ab457094c37e8bd4097093",
            "91eb605a3f8e49999070b32e5d3e2bf8",
            "69f3d1b7d5ec4d1ca1f9e5d1602141ce",
            "7dd2cebe1aeb4133bc3490ff7dffb174",
            "7e23c334cd324a61a7bc41f308023e86",
            "80947ac1eb97454b9f357bb9ee9870f2",
            "557b1bc7aa6e47a197ba0ccc321aa456",
            "a4141381fe374a78a53c511233dbd83c",
            "de38a562560649b2b36778dac5c55665"
          ]
        },
        "executionInfo": {
          "elapsed": 30500,
          "status": "ok",
          "timestamp": 1710849096888,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "RDMYdjEK9rcA",
        "outputId": "41e41e44-da24-4927-fee6-dee0c2bd3bf9"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "9df39a1127104a0ab54979e1b22ba574",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/92 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "all_bits = []\n",
        "for i in tqdm.notebook.tqdm(range(len(filtered_tokens))):\n",
        "  ts = filtered_tokens[i].numpy()\n",
        "  with torch.no_grad():\n",
        "    logits = model(torch.tensor(ts)[None].to(device)).logits[0].cpu().numpy()\n",
        "    # convert logits to probability scores over the vocabulary\n",
        "    p = jax.nn.log_softmax(logits)\n",
        "    # convert to bits per token\n",
        "    indices = jnp.array(list(zip(range(len(ts)), ts))).T\n",
        "    bits = -p[tuple(indices)]\n",
        "\n",
        "    all_bits.append(bits.tolist()[128:]) # we drop the first 128 tokens (warmpu)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 16,
          "status": "ok",
          "timestamp": 1710849096888,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "W0zSUjzRKhwN",
        "outputId": "86e0f60e-d92a-40f6-86c5-76408823ed25"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(92, 896)"
            ]
          },
          "execution_count": 21,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "all_bits = np.array(all_bits)\n",
        "all_bits.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oC6SsUZoIrPI"
      },
      "source": [
        "# Fractal Analysis"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rSFz1BIskZVX"
      },
      "source": [
        "## Increment/integral processes"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "87v5TiIvhRE9"
      },
      "source": [
        "First, let's see how well the model performs. The mean number of bits is the average log-loss."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 209,
          "status": "ok",
          "timestamp": 1710849101247,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "dgeMVcpiIzk8",
        "outputId": "fc457e7c-3ead-4476-94d8-389676cbf71f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(9.206183209857768, 3.177083467097998)"
            ]
          },
          "execution_count": 22,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "bits_mean = np.mean(all_bits)\n",
        "bits_std = np.std(all_bits)\n",
        "bits_mean, bits_std"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HcRKCyEihrJ8"
      },
      "source": [
        "Now, form the increment $x$ and integral $X$ processes. $x$ is basically the sequence of bits after normalization, while $X$ is the integral of $x$."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "028dff309f5a4b139fd9aa59099f3f07",
            "9d26b7802d2844438d1cb42f16ae7a60",
            "9aee3ef29723411f8dcb95df302ab3dd",
            "45e1fb17c84c45579f3c7a46fca2dc9d",
            "09f4f3b75c894f918710b87538a1017e",
            "33092e38d28c4a47b1971a5378256301",
            "dab86858db1345df875702a9e348a93e",
            "178850dbf3734e819d27c4327bcd4bc6",
            "0dbbe5bf04ca4a83af955f3398b3a9bf",
            "a443e87bf0cd4671a936a7a7524357e0",
            "52cde2a7bd474f0a845fe967e9e71064"
          ]
        },
        "executionInfo": {
          "elapsed": 215,
          "status": "ok",
          "timestamp": 1710849103709,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "gbDzF8oeh0m5",
        "outputId": "ba45542f-7a2f-4a8f-aa71-ba0dd90c4f13"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "028dff309f5a4b139fd9aa59099f3f07",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/92 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "text/plain": [
              "((92, 896), (92, 896))"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "x = []\n",
        "X = []\n",
        "\n",
        "for k in tqdm.notebook.tqdm(range(len(all_bits))):\n",
        "  mu = np.mean(all_bits[k])\n",
        "  sigma = np.std(all_bits[k])\n",
        "  x.append((all_bits[k] - mu) / sigma)\n",
        "  X.append(np.cumsum(x[-1]))\n",
        "\n",
        "x = np.array(x)\n",
        "X = np.array(X)\n",
        "x.shape, X.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dSCgUhteipHr"
      },
      "source": [
        "Plot the integral process to see how self-similar it is."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 448
        },
        "executionInfo": {
          "elapsed": 359,
          "status": "ok",
          "timestamp": 1710849106274,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "GOwOGjw4iWsN",
        "outputId": "ebc189e9-8f6f-4121-c185-3f9ce2a70d11"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[\u003cmatplotlib.lines.Line2D at 0x7d1fb1a4fb50\u003e]"
            ]
          },
          "execution_count": 24,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cFigure size 640x480 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.plot(X[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pc8Y2VfRinHZ"
      },
      "source": [
        "## Self-similarity exponent\n",
        "Note below that we have a large variance in estimating the self-similarity exponent. This is because: (1) we only use 100 documents (we used 1K in the paper) and (2) the scale level goes up to 300 only (in the paper we used \u003e500). So, if you see a large variance, consider increasing the number of documents and increasing the granularity levels."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jydzjFqHS_Oo"
      },
      "outputs": [],
      "source": [
        "def get_self_sim_exponent(X,\n",
        "                          scales=DEFAULT_SCALES,\n",
        "                          samples_per_doc=DEFAULT_SAMPLES_PER_DOC,\n",
        "                          eps=DEFAULT_EPS):\n",
        "  \"\"\"Calculate the self-similarity exponent.\n",
        "\n",
        "  Args:\n",
        "    X: integral process, 1D or 2D array.\n",
        "    scales: granuality levels. Choose this carefully.\n",
        "      If it is too large, you will have very few measurements.\n",
        "      If it is too small, your estimate of the power law relation will be\n",
        "      unreliable.\n",
        "    samples_per_doc: number of samples per document. Ideally, this should be\n",
        "      small and the number of documents should be large.\n",
        "    eps: used for calculating peak probability scores. Choose this carefully.\n",
        "      If eps is too small, probability estimates will be unreliable.\n",
        "      If eps is too large, it doesn't reflect peak probabiliy at the origin.\n",
        "\n",
        "  Returns:\n",
        "    S: self-similarity exponent.\n",
        "    p0: peak probability estimates.\n",
        "  \"\"\"\n",
        "  if X.ndim == 1:\n",
        "    X = X.reshape((1, -1))\n",
        "  elif X.ndim \u003e 2:\n",
        "    raise ValueError('X.ndim must be 1 or 2.')\n",
        "\n",
        "  p0 = []\n",
        "  for n in scales:\n",
        "    all = []\n",
        "    for i in (range(len(X))):\n",
        "      for _ in range(samples_per_doc):\n",
        "        offset = np.random.randint(0, len(X[i]) - n)\n",
        "        all.append(X[i][offset + n] - X[i][offset])\n",
        "    all = np.array(all)\n",
        "    p0.append(np.mean(np.abs(all) \u003c eps))\n",
        "\n",
        "  # estimate Holder exponent\n",
        "  return -power_law_fit(scales, p0)[1], p0"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "ddfc1eb07e8a48ca90c368542d1abf67",
            "58b621423b4044588d6cc37f97fc6ad7",
            "a400deb5d6ce4baaa68ea60364d42722",
            "4e975c814b964aaba3d6c3790e55f3e4",
            "4c70eee61b524b34a83036e7a8dead2f",
            "91c8834e865b4999a4ef7ae7c9b934ad",
            "812a4b30648e4a229d5787b56bca20b5",
            "64c509e1679e414aaf549469145bb25f",
            "cb35a23a2ee543d8bc349788fe0f6e5c",
            "08b82e3df5c44aff8662cb2c9fde849b",
            "074f426f3ce1411288eb8d03b433e9d2"
          ]
        },
        "executionInfo": {
          "elapsed": 2930,
          "status": "ok",
          "timestamp": 1710849113710,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "sOE-Dhjvkjbi",
        "outputId": "c0f2a65e-2bbb-4e02-d8e4-47c44f511739"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "ddfc1eb07e8a48ca90c368542d1abf67",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/10 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.5761004041394083 0.15908063049317464\n"
          ]
        }
      ],
      "source": [
        "# use bootstrapping to estimate uncertainty\n",
        "np.random.seed(2024)\n",
        "self_sim_exponent = []\n",
        "for _ in tqdm.notebook.tqdm(range(10)):\n",
        "  articles = np.random.choice(np.arange(len(x)), len(x))  # with replacement\n",
        "  self_sim_exponent.append(get_self_sim_exponent(X[articles])[0])\n",
        "\n",
        "print(np.mean(self_sim_exponent), np.std(self_sim_exponent))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 428
        },
        "executionInfo": {
          "elapsed": 1125,
          "status": "ok",
          "timestamp": 1710849116858,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "23vr2zJzXFfG",
        "outputId": "01d26830-396a-46d4-fd2a-e04972ba11ec"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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dU3TmDFjBnq9nrt37/LDDz/kON6zzz5Lv379Mj1fsmRJXnrpJcB0T+rkyZPWvQE7s/f7bdOmDUOHDrV3mFkaMmQImqZhNBpZvHhxlm2WLl1Kamqqpb29zZgxg9TUVIKDgwkPD890/w9Ap9PxySefULJkSRITE1m9enWG1//1r38BEBcXR2RkZJbjrF69mvv372dob7Z792727t0LwOLFi6lYsWKWfTz99NM899xzAJbPliNJshGFQlRUFLdv3wbI8oe1WeXKlXnqqaes6tPPz4/mzZvnKY7U1FSuXLnCqVOnOH78OMePHycmJoYKFSoA5HoJ758/GNJr3Lix5fH58+fzFJejOPL92ltAQADt2rUDsv/hab6E1rhxYxo0aGD3GDZs2ACYLodllWjMvL29LZcH9+3bl+G1zp07U65cOeDvS2X/ZH7e398/0//h9evXA/DII49YxshOixYtANMlZUdPFpB7NqJQOH78uOVx+h/KWQkODmbdunW59mntD5vU1FTmzZvHV199xeHDh0lJScm27Y0bN3Lsq3bt2tm+5uPjY3l8584dq2JzBHu+X0f8QM/JsGHD+P777zl37hy7d+/O8IM4KirK8v/IEWc10dHRXL9+HYA333yTN99806rj/vzzzwx/L1myJM899xzz589nw4YN3LlzhzJlylhej4mJsRTC9unTJ1NSM890++2333JMeOmlpqZy69YtfH19rWqfH3JmIwqFuLg4y+NKlSrl2Da3183MN5dzcuvWLZo0acJLL73E/v37c/zBC5CUlJTj66VLl872NZ3u74+jwWDINTZHsPf7teZ7bE/du3e3XDYyn8WYLViwAAAPDw/69u1r97FjY2PzdVxW093NZ4RJSUmsWbMmw2srV67EaDRmaOeoOOxJzmxEsaXX63NtM3r0aA4dOgSYfpANGTKEBg0a4Ovri4eHh+U3R39/fy5fvpxrbYSrs/f7teZ7bE/u7u7079+fmTNnEhERwSeffIKnpyfJycmsWLECgB49euR4ny6/0v+CMGnSJMLCwqw6ztPTM9NzLVu2pGrVqly9epXly5czcOBAy2vmS2j169fP8jKZOY6GDRuydOlSq+OvWrWq1W3zQ5KNKBTS/4Z8/fp1AgMDs21rvpRhq4SEBL7++mvA9BtkTh/c9GdejmI+8zH/Vpudu3fv5qt/V3u/+TVs2DBm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\n",
            "text/plain": [
              "\u003cFigure size 400x400 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# see the quality of fit\n",
        "_, y = get_self_sim_exponent(X)\n",
        "fig = plot_power_law(DEFAULT_SCALES,  # because we use default granularity levels\n",
        "                     y,\n",
        "                     yscale='log',\n",
        "                     xlabel='granularity level',\n",
        "                     ylabel='peak probability', )"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "unwAYiZKPnJG"
      },
      "source": [
        "## Hurst exponent"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LyenuO9bTDIh"
      },
      "outputs": [],
      "source": [
        "def get_hurst_exponent(x,\n",
        "                       scales=DEFAULT_SCALES,\n",
        "                       samples_per_doc=DEFAULT_SAMPLES_PER_DOC):\n",
        "  \"\"\"Calculate the Hurst exponent.\n",
        "\n",
        "  Args:\n",
        "    x: increment process, 1D or 2D array.\n",
        "    scales: granuality levels. Choose this carefully.\n",
        "      If it is too large, you will have very few measurements.\n",
        "      If it is too small, your estimate of the power law relation will be\n",
        "      unreliable.\n",
        "    samples_per_doc: number of samples per document. Ideally, this should be\n",
        "      small and the number of documents should be large.\n",
        "\n",
        "  Returns:\n",
        "    H: Hurst exponent.\n",
        "    sr: rescaled range estimates.\n",
        "  \"\"\"\n",
        "  if x.ndim == 1:\n",
        "    x = x.reshape((1, -1))\n",
        "  elif x.ndim \u003e 2:\n",
        "    raise ValueError('x.ndim must be 1 or 2.')\n",
        "\n",
        "  # calculate the rescaled range\n",
        "  sr = []\n",
        "  for n in scales:\n",
        "    som = 0\n",
        "    count = 0\n",
        "    for i in range(len(x)):  # to get a reliable etimate, many documents are needed\n",
        "      for _ in range(samples_per_doc):\n",
        "        offset = np.random.randint(0, len(x[i]) - n)\n",
        "        y = x[i, offset: n + offset]\n",
        "        y = y - np.mean(y)\n",
        "        Y = np.cumsum(y)\n",
        "        R = max(Y) - min(Y)\n",
        "        S = np.std(y)\n",
        "        som += R / S\n",
        "        count += 1\n",
        "    sr.append(som / count)\n",
        "\n",
        "  # estimate Hurst exponent\n",
        "  return power_law_fit(scales, sr)[1], sr"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "8236cd8a80804aaa9ec0a5a9941320c9",
            "700b1af453ec4a82bd63ea66b106a1c8",
            "927aac02f3b34cf5a9bf1995fb0b21a2",
            "d99371d2d2ff4aeebda74d19d7bde614",
            "9c9ffc6d48cc4e8fb7daafc0a57ae6ed",
            "8ce9d7be77ea46d7b3259db1e302999a",
            "9e353e1c0cc04e208effd77131d43659",
            "8019a122025e432a986cd7f39ff4a0f2",
            "83190fee4e584fb8b7b67644774cf5d3",
            "613c487b4fb54b7988b7291fd0edd12e",
            "a35287c2d01c450ba69074bb5d22ac00"
          ]
        },
        "executionInfo": {
          "elapsed": 44470,
          "status": "ok",
          "timestamp": 1710849165981,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "G1bg_WHTPqGu",
        "outputId": "e3dd247f-4134-4103-c278-766d9da4064a"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "8236cd8a80804aaa9ec0a5a9941320c9",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/10 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.6075745642675432 0.006985823794845016\n"
          ]
        }
      ],
      "source": [
        "hurst_exponent = []\n",
        "for _ in tqdm.notebook.tqdm(range(10)):\n",
        "  articles = np.random.choice(np.arange(len(x)), len(x))  # with replacement\n",
        "  hurst_exponent.append(get_hurst_exponent(x[articles])[0])\n",
        "\n",
        "print(np.mean(hurst_exponent), np.std(hurst_exponent))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 428
        },
        "executionInfo": {
          "elapsed": 5296,
          "status": "ok",
          "timestamp": 1710849171276,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "y2QqP6kzZMtw",
        "outputId": "cbbe89e2-0eec-4f02-86a9-ad52f8e64070"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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EVoCVYmIuM/vw6Zz586AOUW2ffv2Ao/75ptv8h536tTJ8rou1L99uNvtaQrjdBn0b1+6IzMREb8Pm759++Y9XrBgQb7HuFwuFi9eDEBISAjdunUrjdLytKpXnahGbo5uLsNhtxHVKEz32IhIqfP7sImKiqJLly4AzJs3j61bt15yzMyZM/O6BowePdrtC2IlaXq/NjjcmCa7HIfNxvR+bUqoIhER95X7BQKbNm1i//79ec9zOwKAeR3mj/e+5Ld75+zZs+nUqROZmZl0796d8ePHX7SfzZtvvglAs2bNGDNmjCV/R2EiagYxo38bnli207NmnL+xATP6/7avjYhIKbMZhgfdHcugIUOGXHLn/uUU9Ofmt1PnhZo1a1YqO3WmpqZSvXp1UlJSqFat2iXvX7ifjTvXcRx2Gw6bjRn929CnbT0rShYRP1bYb1Yuv59Gy9W7d2927drFk08+SbNmzahSpQohISG0b9+eadOmsWPHDkuDZs6cObRs2ZLIyMjLHtenbT2in+xKu4bmirKCruPkvt6+YSjRT3ZV0IiIV5X7kY2vcfffEgC+P5bC8rgjxCYksy8xjWynQaDDRtPaVYmMCKV/+3AtBhARS7n7m1Xur9n4s1b1ql8UJi6XoRY0IlImaRrNhyhoRKSsUtiIiIjlFDYiImI5hY2IiFhOYSMiIpZT2IiIiOUUNiIiYjmFjYiIWE5hU0a4265GRKQ8UruaMsaTdjUiIt6mRpwiIlJmKGxERMRyChsREbGcwkZERCynsBEREcspbERExHIKGxERsZzCRkRELKewERERyylsRETEcgobERGxnMKmjFAjThHxZWrEWcaoEaeIlCdqxCkiImWGwkZERCynsBEREcspbERExHIKGxERsZzCRkRELKewERERyylsRETEcgobERGxnMJGREQsp7ARERHLKWxERMRyChsREbGcwqaM0BYDIuLLtMVAGaMtBkSkPNEWAyIiUmYobERExHIKGxERsZzCRkRELKewERERyylsRETEcgobERGxnMJGREQsp7ARERHLKWxERMRyChsREbGcwkZERCynsBEREcspbERExHIKGxERsZzCpozQ5mki4su0eVoZo83TRKQ80eZpIiJSZihsRETEcgobERGxnMJGREQsp7ARERHLKWxERMRyChsREbGcwkZERCynsBEREcsFeLsAuVhu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\n",
            "text/plain": [
              "\u003cFigure size 400x400 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# see the quality of fit\n",
        "_, y = get_hurst_exponent(X)\n",
        "fig = plot_power_law(DEFAULT_SCALES,  # because we use default granularity levels\n",
        "                     y,\n",
        "                     yscale='log',\n",
        "                     xlabel='n',\n",
        "                     ylabel='R(n) / S(n)')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1_UVly4WPsPa"
      },
      "source": [
        "## Joseph exponent"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "fV124YGATG0Z"
      },
      "outputs": [],
      "source": [
        "def get_joseph_exponent(x,\n",
        "                        scales=DEFAULT_SCALES,\n",
        "                        samples_per_doc=DEFAULT_SAMPLES_PER_DOC):\n",
        "  \"\"\"Calculate the Joseph exponent.\n",
        "\n",
        "  Args:\n",
        "    x: increment process, 1D or 2D array.\n",
        "    scales: granuality levels. Choose this carefully.\n",
        "      If it is too large, you will have very few measurements.\n",
        "      If it is too small, your estimate of the power law relation will be\n",
        "      unreliable.\n",
        "    samples_per_doc: number of samples per document. Ideally, this should be\n",
        "      small and the number of documents should be large.\n",
        "\n",
        "  Returns:\n",
        "    J: Joseph exponent.\n",
        "    sigmas: standard deviations estimate.\n",
        "  \"\"\"\n",
        "  if x.ndim == 1:\n",
        "    x = x.reshape((1, -1))\n",
        "  elif x.ndim \u003e 2:\n",
        "    raise ValueError('x.ndim must be 1 or 2.')\n",
        "\n",
        "  sigmas = []\n",
        "  v = []\n",
        "  for n in scales:\n",
        "    for i in range(len(x)):\n",
        "      for _ in range(samples_per_doc):\n",
        "        offset = np.random.randint(0, len(x[i]) - n)\n",
        "        v.extend([X[i][offset + n] - X[i][offset]])\n",
        "    sigmas.append(np.std(v))\n",
        "\n",
        "  # estimate Joseph exponent\n",
        "  return power_law_fit(scales, sigmas)[1], sigmas"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "e1d63f9711be43f4bd459853afd83504",
            "d32335fd8bca4360802503554e7ff484",
            "bf213b1de233425482019f18ff20685e",
            "14d0fc98d2da49a1975bbcd5847c0843",
            "595ecea9ef754cbf8361a1f0937f027d",
            "7e065a544a434b259052367db726ea6f",
            "4f6b21d50549427ca3bb19a94ef7a4be",
            "c6b1f7a0dfec4ed1a7ad5a4a49d711ce",
            "7209cada697947678979cb4f3389f2f2",
            "5c274c332b144b70a612d6c818ec6a90",
            "7d6ddbae93da412894845548dd8fc5ce"
          ]
        },
        "executionInfo": {
          "elapsed": 2475,
          "status": "ok",
          "timestamp": 1710849173747,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "QpGZGA8fPuxf",
        "outputId": "5f7a9104-89ba-448c-d054-cf7b9377e752"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "e1d63f9711be43f4bd459853afd83504",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/10 [00:00\u003c?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.35772080370919374 0.002647717654797778\n"
          ]
        }
      ],
      "source": [
        "joseph_exponent = []\n",
        "for _ in tqdm.notebook.tqdm(range(10)):\n",
        "  articles = np.random.choice(np.arange(len(x)), len(x))  # with replacement\n",
        "  joseph_exponent.append(get_joseph_exponent(x)[0])\n",
        "\n",
        "print(np.mean(joseph_exponent), np.std(joseph_exponent))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 428
        },
        "executionInfo": {
          "elapsed": 906,
          "status": "ok",
          "timestamp": 1710849174650,
          "user": {
            "displayName": "Ibrahim Alabdulmohsin",
            "userId": "15347871053891839154"
          },
          "user_tz": -60
        },
        "id": "Y35hcPj6aHrk",
        "outputId": "9d6810a4-20b5-42cf-f300-5a2a66438010"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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Li6u1Lmff/65ERYWdtlzf2327NmXPad+/frG+vXry617/PjxBmC0bdu23Dbbt283mjZtWuH73HXXXUZOTk6V/uzENwS4P85E/FtBQQGjR48mOzubhg0b8rvf/Y7bb7+d5s2bU1hYSGpqKt988w0bNmwode4XX3zB4MGDKS4uxmaz8eCDDzJs2DDatGnDuXPn+Omnn9iyZQtxcXGlzi0uLqZly5aMGDGCm2++mXbt2lG3bl3S09P55ptvePvtt8nNzWXMmDF8//33dO7c2enP9vXXXzN48GCKiopo0aIFf/jDH7juuuto1aoVx48fZ/Xq1axcuZJPP/2U8ePHs27duir9GYoP8HTaifi6+Pj4Ckcu5xUVFRlZWVklX+fn5xutWrUqGYF88cUX5Z77r3/9q9RrqampRmFhYbnnpKenG+Hh4QZgjB07tsw2FY1sCgsLjcjISAMwBg0aZJw9e7bMPhYvXlzy+bdt21ZuPeLbdM9GxM3+/e9/lxz37du33HYBAQGEhISUfL18+XKOHz8OwGuvvcZtt91W7rkRERGlXouMjCQwMLDcc1q3bs2MGTMA2LRpk9P3VVatWkVaWhp169Zl+fLl1K9fv8x2kydPpmfPngAsXbrUqfcQ36GwEXGzli1blhwvWbKk0ud98sknAAQHBzN58uRq15GdnU1qaio//vgjhw4d4tChQyUBcf57zti0aRMA/fr1o1mzZhW2PR+ye/bsqULl4gt0z0bEzfr06UO7du345z//ydSpU/nwww8ZMWIEffv2JSoqijp16pR53v79+wG48cYbyx01XM6RI0d44403iIuL48iRIxW2PXXqFO3atat03wkJCQBs3boVi8VSqXMuHuWJf1HYiLhZYGAgcXFx3HfffRw+fJh9+/axb98+AOrVq0ffvn0ZN24co0aNwmazlZx36tQp4NKRkTO2bNnCfffdR15eXqXa5+fnO9X/iRMnnK7J2fcQ36GwEakBXbp04eDBg8TFxREXF8fOnTtJSUkhPz+frVu3snXrVt58800+/fRTmjdvXu33O3XqFGPGjCEvL48GDRrw1FNPceedd9K+fXtCQ0NLRlM7duxgwIABAE7fs7Hb7QAMHjyYefPmVbtm8W0KG5EaYrPZGD58OMOHDwcgIyODzz77jEWLFpGYmEhiYiKPPPJIyRTosLAwjh49SkZGhtPvtXbtWs6cOQPAhg0buOOOO8psl5mZWaXPAtC0aVOOHz9OYWEhXbt2rXI/4h80QUDEQ1q2bMnEiRPZs2cPN9xwA2BOCjh/qen8awkJCZW+FHbejz/+CECTJk3KDZrzfVfV9ddfX9JHYWFhlfsR/6CwEfGwwMBA+vXrB5gPYp4fkQwZMgSAvLw8Fi9e7FSfxcXFAJw7dw6Hw1Fmm7y8PFasWFHFqmHo0KGAuVSNM7PsxD8pbETcbNeuXaSkpJT7/cLCQr766isAGjRoUDKNeOzYsYSHhwPw3HPPlbQpy9GjRy/5+qqrrgLMQFmzZk2p9na7nYceeqjkOZ6qGD9+fMnzPU899RQ7d+6ssP3u3bsr/Azi23TPRsTN4uPjeeWVV7j11lu5++676datG82aNSM/P59ffvmFd955h++//x6ASZMmERBg/rOsW7cuK1asIDo6mry8PO644w4efPBBhg8fTuvWrSkoKODnn3/m008/ZdOmTRQUFJS85/3338+sWbMoKChg4sSJHDhwgIEDBxIaGsqPP/7IwoULSUxMpHfv3mUu4lkZQUFBrFmzhttuu43c3Fz69+/P6NGjGT58OFdeeSUOh4OMjAwSExPZsGEDBw8eZOHChSWjOPEznl7CQMTXVWZBTMAYNmyYkZeXV+r8zz77zGjcuLHTC3F+8MEHhtVqLbf9qFGjjO3bt5d8XdZyOJVZiHPPnj1GREREpT7jsmXLqvNHKV5MIxsRN3vqqafo1q0b27dvZ//+/Rw/frzkGZUrrriCnj17Mm7cOO6+++4yz7/zzjv55z//yd/+9jc++eQT/vGPf3DmzBmCg4Pp0KEDffv2ZcyYMaXOmzhxIldffTXz58/n66+/5syZM4SFhXHdddcxceJE7r//fr788stqf76bbrqJ5ORkli5dSlxcHPv37+fUqVNYrVaaNWtG586d6devHyNHjuTqq6+u9vuJd7IYhjaaEBER99IEARERcTuFjYiIuJ3CRkRE3E5hIyIibqewERERt1PYiIiI2ylsRETE7RQ2IiLidgobERFxO4WNiIi4ncJGRETcTmEjIiJup7ARERG3U9iIiIjb/X9SuFDdJpoAAAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 400x400 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# see the quality of fit\n",
        "_, y = get_joseph_exponent(X)\n",
        "fig = plot_power_law(DEFAULT_SCALES,  # because we use default granularity levels\n",
        "                     y,\n",
        "                     yscale='log',\n",
        "                     xlabel='scale',\n",
        "                     ylabel='$\\Sigma$')"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "provenance": [
        {
          "file_id": "1S7U9VPWh486zpAJBn8X9ZnO06ThBvS4L",
          "timestamp": 1711479194334
        }
      ],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
